• 締切済み

PerlでUNIXのコマンドとパスワード入力

ブラウザでユーザー名とパスワードを入力して passwdコマンドでパスワードを変更するプログラムを作っています。 プログラム中で $result=system("passwd $user"); と実行すると、マシンは New UNIX password: の状態になって、パスワードの入力を待っていると思うのですが、 この状態でどうやってパスワード$passをマシンに送ったらいいのか わかりません。キーボードから読み取るのではなく、 プログラムですぐにパスワードを送りたいのです。 標準入力にフラッシュする?というのでしょうか。 system($pass); としてもうまくいきません。 OSはFedoraCoreで、スクリプトはルート権限で動いています。 どうかご教示ください。

みんなの回答

回答No.9

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)
回答No.8

>New UNIX password: パスワード の次が出ないという事でしたので、次の文字列の表示待ちで 止まっているのかと思いましたが、改行自体がされていない のかもしれませんね。 スクリプト中の【send "$passwd\n"】の部分ですが、 【send "$passwd\n\r"】に変更して実行したらどうなりますでしょうか。

  • navesan
  • ベストアンサー率0% (0/0)
回答No.7

もう解決されてそうなので蛇足になってしまいそうですが、 >まずはコマンドラインで実行してみようと >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の内容をそれに 合わせて修正していただければ解決するかと思われるのですが、 いかがでしょうか。

sco123
質問者

補足

返信ありがとうございます。 expectを使ったものも習得できるとありがたいのです。 文字列は大文字小文字も含めてチェックしました。 Retype new UNIX password: で間違いないのです。コロンのあとは半角スペースなどいらないですよね。 教えていただいた Debianのメーリングリストでもタイムアウトしているようなので やはり無理なのでしょうか。

  • navesan
  • ベストアンサー率0% (0/0)
回答No.6

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行目だけで大丈夫だと思いますが。)

sco123
質問者

補足

ありがとうございます。 以下の内容で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)
回答No.5

よく読んでみたらvpopmailでのパスワード変更でしょうか? それならvpasswdコマンドを使用します。 vpasswd email_address [password] という感じで、一発で変更できます。

sco123
質問者

お礼

できました。 ありがとうございました。 とても助かります。

  • mflow
  • ベストアンサー率63% (42/66)
回答No.4

うわ、これ私が回答したやつですね。 中途半端な回答ですみません。 -bオプションをつけてみてはいかがでしょうか。バッチモードで動きます。 -bオプションで問題があるならexpectをかませてみてください。

noname#39970
noname#39970
回答No.3

ありゃ、同じだったとは これは失礼(^^;;; (人名見てないし No1の先やsambapasswdを見るとどれもこれもpasswdを外から操作する為にCやC++で組んである皮を使ってるみたい。 純粋にperlのみではpasswdの挙動を制御できないんだと思う。 No1で出してるURLの先にあるガワや、それらを参考にしてCやC++辺りでコマンドの挙動をキャッチするしか無いんだと思う。

noname#39970
noname#39970
回答No.2

これと同じような質問? http://internet.okwave.jp/qa2479655.html

sco123
質問者

補足

ありがとうございます。実は上記の質問は私がしたものなのですが、 こちらのほうはPAMを使って解決しました。 今回はパスワード認証に限ったことではなくて、 UNIXでコマンドを打っていると、 New UNIX password: のように「待ち」の状態になることがあるのですが、 そのときにプログラムで入力をどうやって送るのかがわからないのです。 system関数に引数があって、それで一気に $result=system("passwd $user",$pass); のように渡すのかなと思ったりしたのですが・・・ ご存知でしたら教えていただけないでしょうか。 実はクライアントさんからサーバーのユーザーの メールパスワードをブラウザで変更したいといわれ、 postfixのようにシステムのユーザーとパスワードを使って いるのだろうと思い、上記URLのような質問をして調べていたのですが、 vpopmailというシステムユーザーに依存しないものを使っていたので、 vpopmailのコマンドでパスワードを変更しようと思ったのですが、 上記のような「待ち」の状態の入力がわからず困っているのです。

回答No.1

実際に作ったことはありませんが、私もサーバを立てるときにuserminを導入するまで変更用の cgi を使っていたことがあります。 perlではないのですが、参考URLに付したページが有名です。 知っていたら申し訳ないです。

参考URL:
http://oku.edu.mie-u.ac.jp/~okumura/cplusplus/passwd.html
sco123
質問者

補足

とんでもないです。ありがとうございます。 上記URLはさんざん調べて見つけたので知っていました。 Perlで書かれたこちらのほうがわかりやすいと思います。 http://www.linuxworld.jp/rendou/2003/200308_01.html