dポイントプレゼントキャンペーン実施中!

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

A 回答 (9件)

debianユーザーですが、expectのほうでまったく同じ症状が起こり困っておりました。


どうもタイミングの問題のようで、
expect "password:"
sleep 0.5
send "OLDPASSWD"
expect "password:"
sleep 0.5
send "NEWPASSWD"
expect "password:"
sleep 0.5
send "NEWPASSWD"
で使えました。
    • good
    • 0

>New UNIX password: パスワード



の次が出ないという事でしたので、次の文字列の表示待ちで
止まっているのかと思いましたが、改行自体がされていない
のかもしれませんね。

スクリプト中の【send "$passwd\n"】の部分ですが、
【send "$passwd\n\r"】に変更して実行したらどうなりますでしょうか。
    • good
    • 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の内容をそれに
合わせて修正していただければ解決するかと思われるのですが、
いかがでしょうか。

この回答への補足

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

補足日時:2006/10/30 20:49
    • good
    • 0

perlで実現するには、expectを組み合わせる必要があると思います。



以下のアドレスのスクリプトを用意し、引数1にユーザー名、
引数2にパスワードを指定して実行すると非対話でユーザーの
パスワードを変更できますので、perlスクリプトでユーザー名と
パスワードを取得してからsystemで実行するようにしてみてください。
(system ("/hoge/passchange.sh $USERNAME $PASSWORD")とか)
http://lists.debian.or.jp/debian-users/200012/ms …

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と
エラーがでて
最後までいってしまいます。

補足日時:2006/10/30 16:33
    • good
    • 0

よく読んでみたらvpopmailでのパスワード変更でしょうか?


それならvpasswdコマンドを使用します。

vpasswd email_address [password]
という感じで、一発で変更できます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/30 17:16

うわ、これ私が回答したやつですね。


中途半端な回答ですみません。

-bオプションをつけてみてはいかがでしょうか。バッチモードで動きます。

-bオプションで問題があるならexpectをかませてみてください。
    • good
    • 0

ありゃ、同じだったとは これは失礼(^^;;; (人名見てないし



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

これと同じような質問?


http://internet.okwave.jp/qa2479655.html

この回答への補足

ありがとうございます。実は上記の質問は私がしたものなのですが、
こちらのほうはPAMを使って解決しました。
今回はパスワード認証に限ったことではなくて、
UNIXでコマンドを打っていると、
New UNIX password:
のように「待ち」の状態になることがあるのですが、
そのときにプログラムで入力をどうやって送るのかがわからないのです。
system関数に引数があって、それで一気に
$result=system("passwd $user",$pass);
のように渡すのかなと思ったりしたのですが・・・
ご存知でしたら教えていただけないでしょうか。

実はクライアントさんからサーバーのユーザーの
メールパスワードをブラウザで変更したいといわれ、
postfixのようにシステムのユーザーとパスワードを使って
いるのだろうと思い、上記URLのような質問をして調べていたのですが、
vpopmailというシステムユーザーに依存しないものを使っていたので、
vpopmailのコマンドでパスワードを変更しようと思ったのですが、
上記のような「待ち」の状態の入力がわからず困っているのです。

補足日時:2006/10/30 01:54
    • good
    • 0

実際に作ったことはありませんが、私もサーバを立てるときにuserminを導入するまで変更用の cgi を使っていたことがあります。



perlではないのですが、参考URLに付したページが有名です。
知っていたら申し訳ないです。

参考URL:http://oku.edu.mie-u.ac.jp/~okumura/cplusplus/pa …

この回答への補足

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

補足日時:2006/10/30 01:56
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!