- 締切済み
PerlでUNIXのコマンドとパスワード入力
ブラウザでユーザー名とパスワードを入力して passwdコマンドでパスワードを変更するプログラムを作っています。 プログラム中で $result=system("passwd $user"); と実行すると、マシンは New UNIX password: の状態になって、パスワードの入力を待っていると思うのですが、 この状態でどうやってパスワード$passをマシンに送ったらいいのか わかりません。キーボードから読み取るのではなく、 プログラムですぐにパスワードを送りたいのです。 標準入力にフラッシュする?というのでしょうか。 system($pass); としてもうまくいきません。 OSはFedoraCoreで、スクリプトはルート権限で動いています。 どうかご教示ください。
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- fyamaboss
- ベストアンサー率0% (0/0)
debianユーザーですが、expectのほうでまったく同じ症状が起こり困っておりました。 どうもタイミングの問題のようで、 expect "password:" sleep 0.5 send "OLDPASSWD" expect "password:" sleep 0.5 send "NEWPASSWD" expect "password:" sleep 0.5 send "NEWPASSWD" で使えました。
- navesan
- ベストアンサー率0% (0/0)
>New UNIX password: パスワード の次が出ないという事でしたので、次の文字列の表示待ちで 止まっているのかと思いましたが、改行自体がされていない のかもしれませんね。 スクリプト中の【send "$passwd\n"】の部分ですが、 【send "$passwd\n\r"】に変更して実行したらどうなりますでしょうか。
- navesan
- ベストアンサー率0% (0/0)
もう解決されてそうなので蛇足になってしまいそうですが、 >まずはコマンドラインで実行してみようと >expect passwd.sh ユーザー名 パスワード >と入力したところ、 >spawn passwd ユーザー名 >Changeng password for user ユーザー名 >New UNIX password: パスワード >とここまでは表示されるのですが、 >ここで止まってしまう感じです。 スクリプトの7行目の expect "Retype new UNIX password:" で、標準出力に"Retype new UNIX password:"が出るのを 待っている状態で止まっているものと思われますので、 恐らくは、お使いのシステムでのパスワードのリタイプ要求の 文字列が"Retype new UNIX password:"で無い為に、待ち状態の ままタイムアウトになってしまっているものと思われます。 普通にpasswdコマンドでパスワード変更を行なった際に出てくる 待ち受け文字列をメモして、7行目のexpectの内容をそれに 合わせて修正していただければ解決するかと思われるのですが、 いかがでしょうか。
- navesan
- ベストアンサー率0% (0/0)
perlで実現するには、expectを組み合わせる必要があると思います。 以下のアドレスのスクリプトを用意し、引数1にユーザー名、 引数2にパスワードを指定して実行すると非対話でユーザーの パスワードを変更できますので、perlスクリプトでユーザー名と パスワードを取得してからsystemで実行するようにしてみてください。 (system ("/hoge/passchange.sh $USERNAME $PASSWORD")とか) http://lists.debian.or.jp/debian-users/200012/msg00562.html 5行目の"Enter new UNIX password:"は"New UNIX password:"と するなど、表示待ちの部分はお使いのシステムに合わせて修正する 必要があります。(多分5行目だけで大丈夫だと思いますが。)
補足
ありがとうございます。 以下の内容でpasswd.shを作り、 #!/usr/bin/expect set user [lindex $argv 0] set passwd [lindex $argv 1] spawn passwd $user expect "New UNIX password:" send "$passwd\n" expect "Retype new UNIX password:" send "$passwd\n" expect "passwd: all authentication tokens updated successfully" send "exit\r" expect eof puts "ok" まずはコマンドラインで実行してみようと expect passwd.sh ユーザー名 パスワード と入力したところ、 spawn passwd ユーザー名 Changeng password for user ユーザー名 New UNIX password: パスワード とここまでは表示されるのですが、 ここで止まってしまう感じです。 set timeout 600などとタイムアウトを設定してみても 設定した時間だけ止まってしまいます。 タイムアウトを過ぎるとパスワードの入力のないまま Sorry, passwords do not matchと エラーがでて 最後までいってしまいます。
- mflow
- ベストアンサー率63% (42/66)
よく読んでみたらvpopmailでのパスワード変更でしょうか? それならvpasswdコマンドを使用します。 vpasswd email_address [password] という感じで、一発で変更できます。
お礼
できました。 ありがとうございました。 とても助かります。
- mflow
- ベストアンサー率63% (42/66)
うわ、これ私が回答したやつですね。 中途半端な回答ですみません。 -bオプションをつけてみてはいかがでしょうか。バッチモードで動きます。 -bオプションで問題があるならexpectをかませてみてください。
ありゃ、同じだったとは これは失礼(^^;;; (人名見てないし No1の先やsambapasswdを見るとどれもこれもpasswdを外から操作する為にCやC++で組んである皮を使ってるみたい。 純粋にperlのみではpasswdの挙動を制御できないんだと思う。 No1で出してるURLの先にあるガワや、それらを参考にしてCやC++辺りでコマンドの挙動をキャッチするしか無いんだと思う。
これと同じような質問? http://internet.okwave.jp/qa2479655.html
補足
ありがとうございます。実は上記の質問は私がしたものなのですが、 こちらのほうはPAMを使って解決しました。 今回はパスワード認証に限ったことではなくて、 UNIXでコマンドを打っていると、 New UNIX password: のように「待ち」の状態になることがあるのですが、 そのときにプログラムで入力をどうやって送るのかがわからないのです。 system関数に引数があって、それで一気に $result=system("passwd $user",$pass); のように渡すのかなと思ったりしたのですが・・・ ご存知でしたら教えていただけないでしょうか。 実はクライアントさんからサーバーのユーザーの メールパスワードをブラウザで変更したいといわれ、 postfixのようにシステムのユーザーとパスワードを使って いるのだろうと思い、上記URLのような質問をして調べていたのですが、 vpopmailというシステムユーザーに依存しないものを使っていたので、 vpopmailのコマンドでパスワードを変更しようと思ったのですが、 上記のような「待ち」の状態の入力がわからず困っているのです。
- hydrangeas0722
- ベストアンサー率41% (10/24)
実際に作ったことはありませんが、私もサーバを立てるときにuserminを導入するまで変更用の cgi を使っていたことがあります。 perlではないのですが、参考URLに付したページが有名です。 知っていたら申し訳ないです。
補足
とんでもないです。ありがとうございます。 上記URLはさんざん調べて見つけたので知っていました。 Perlで書かれたこちらのほうがわかりやすいと思います。 http://www.linuxworld.jp/rendou/2003/200308_01.html
補足
返信ありがとうございます。 expectを使ったものも習得できるとありがたいのです。 文字列は大文字小文字も含めてチェックしました。 Retype new UNIX password: で間違いないのです。コロンのあとは半角スペースなどいらないですよね。 教えていただいた Debianのメーリングリストでもタイムアウトしているようなので やはり無理なのでしょうか。