|
68userさん > こないだは説明が足りずに済みません。助かりました。 またしても質問なんですが、 sh スクリプトで2つのファイルの内容が完全に一致した場合に aというファイルに 日付,"一致"(文字列)を出力して、 一致しなかった場合には 日付,"不一致"(文字列)を出力したいんですが 全然わかりません。よろしかったら教えてください。 |
|
ファイルの比較には cmp か diff を使います。一致 したかどうかはコマンドの戻り値を見ればよいですが、 sh なら $? で参照できます。あとはマニュアルを よく読んでみてください。 |
|
No.1269で、超初心者さんがやってたのと同じように、CGIからexpectスクリプト を呼び出して、他のマシンにtelnetしてパスワードを変更するシステムを作って いるんですが、telnetで戻ってきた文字が一部うまくexpectに渡されないようで 途中で止まってしまい、上手くいきません。 そこで$|=1にして出力を見たら、以下のところで止まっている事が分かりました。 spawn telnet server Trying xxx.xxx.xxx.xxx ... Connected to server.xxx.xxx. Escape character is '^]'. ”Escape character is '^]'.”の後に、CRLFが来るんですが、それから先が上手 くexpectに渡されていない(?)ようです。 HTTPdがCRLFだから止めてしまっているんでしょうか? それってHTTPdの仕様なんでしょうか? exec 'expect';の後のprint文はexpectのtimeout後に出力されます。 どこで止めてしまってしまっているかを調べる方法や解決方法など、アイディア がありましたら教えてください。 |
|
僕は expect 使ったことありませんのでわかりませんが、せっかく perl を使っているんですから、Net::Telnet モジュールでやって みてはいかがでしょう。 use Net::Telnet; $t = Net::Telnet->(Timeout=>10, Prompt => '/\w+?@\w+?: /'); $t->open('hostname'); $t->login('yourname', 'password'); @lines = $t->cmd("/bin/ls -l"); print @lines; $t->close(); 言うまでもないかもしれませんが、Prompt のところは適切に 変更しないと動きません。詳しくは perldoc Net::Telnet をどうぞ。 |
|
うーん、むずかしい…。全然理解してないことがよくわかった。 すごく汚くて変な書き方ですがこんな感じ。 use Net::Telnet; $username='yourname'; $oldpasswd='secret1'; $newpasswd='secret2'; $t = new Net::Telnet (Timeout => 5, Prompt => '/\w*? /', Dump_Log => 'telnet-log'); $t->open("localhost"); $t->login($username, $oldpasswd); $t->prompt('/Old password:/'); $t->cmd("/usr/bin/passwd"); $t->print("$oldpasswd\n"); ($prematch,$match) = $t->waitfor('/[a-zA-Z ]+:/'); print "[$prematch] [$match]\n"; $t->print("$newpasswd\n"); ($prematch,$match) = $t->waitfor('/[a-zA-Z ]+:/'); print "[$prematch] [$match]\n"; $t->print("$newpasswd\n"); ($prematch,$match) = $t->waitfor('/[a-zA-Z ]+:/'); print "[$prematch] [$match]\n"; $t->close(); 適当に $match の結果に応じて、パスワードが違うやら、 新しいパスワードが短いやら出力すればいいのかな。 expect の方がすっきり書けるような気も。 |
|
やっぱ僕がやるとしたら pw コマンドの wrapper 作って、 それを root に suid するなぁ。passwd の挙動を 全て把握するのは厳しい。 |