|
僕は 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 の挙動を 全て把握するのは厳しい。 |