
ブラウザでユーザー名とパスワードを入力して
passwdコマンドでパスワードを変更するプログラムを作っています。
プログラム中で
$result=system("passwd $user");
と実行すると、マシンは
New UNIX password:
の状態になって、パスワードの入力を待っていると思うのですが、
この状態でどうやってパスワード$passをマシンに送ったらいいのか
わかりません。キーボードから読み取るのではなく、
プログラムですぐにパスワードを送りたいのです。
標準入力にフラッシュする?というのでしょうか。
system($pass);
としてもうまくいきません。
OSはFedoraCoreで、スクリプトはルート権限で動いています。
どうかご教示ください。
A 回答 (9件)
- 最新から表示
- 回答順に表示
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"
で使えました。
No.8
- 回答日時:
>New UNIX password: パスワード
の次が出ないという事でしたので、次の文字列の表示待ちで
止まっているのかと思いましたが、改行自体がされていない
のかもしれませんね。
スクリプト中の【send "$passwd\n"】の部分ですが、
【send "$passwd\n\r"】に変更して実行したらどうなりますでしょうか。
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の内容をそれに
合わせて修正していただければ解決するかと思われるのですが、
いかがでしょうか。
この回答への補足
返信ありがとうございます。
expectを使ったものも習得できるとありがたいのです。
文字列は大文字小文字も含めてチェックしました。
Retype new UNIX password:
で間違いないのです。コロンのあとは半角スペースなどいらないですよね。
教えていただいた
Debianのメーリングリストでもタイムアウトしているようなので
やはり無理なのでしょうか。
No.6
- 回答日時:
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と
エラーがでて
最後までいってしまいます。
No.5
- 回答日時:
よく読んでみたらvpopmailでのパスワード変更でしょうか?
それならvpasswdコマンドを使用します。
vpasswd email_address [password]
という感じで、一発で変更できます。
No.4
- 回答日時:
うわ、これ私が回答したやつですね。
中途半端な回答ですみません。
-bオプションをつけてみてはいかがでしょうか。バッチモードで動きます。
-bオプションで問題があるならexpectをかませてみてください。
No.3
- 回答日時:
ありゃ、同じだったとは これは失礼(^^;;; (人名見てないし
No1の先やsambapasswdを見るとどれもこれもpasswdを外から操作する為にCやC++で組んである皮を使ってるみたい。
純粋にperlのみではpasswdの挙動を制御できないんだと思う。
No1で出してるURLの先にあるガワや、それらを参考にしてCやC++辺りでコマンドの挙動をキャッチするしか無いんだと思う。
No.2
- 回答日時:
この回答への補足
ありがとうございます。実は上記の質問は私がしたものなのですが、
こちらのほうは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/pa …
この回答への補足
とんでもないです。ありがとうございます。
上記URLはさんざん調べて見つけたので知っていました。
Perlで書かれたこちらのほうがわかりやすいと思います。
http://www.linuxworld.jp/rendou/2003/200308_01.h …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlのライセンス
-
Cからシェルを起動し返り値をハ...
-
powershellで関数名を変更する...
-
「デバイスは PRN を初期化でき...
-
LCD ディスプレイを Raspberry ...
-
vba userFormのSubを標準モジュ...
-
ベースモジュールって?
-
本当にPublicな変数(配列で)
-
Excel VBAでリンク切れをチェッ...
-
エクセルVBAでシートモジュール...
-
モジュールからフォームのボタ...
-
Excel VBA 『Call』で呼び出す...
-
VBAで旧字体を異字体に一括で変...
-
CygwinでPerlのCSV_XSを実行する
-
Perlの実行パスを自動で変更す...
-
標準モジュールにpublicで宣言...
-
VBAProjectのモジュ...
-
VBAを使用してWordからExcelの...
-
Oracleのデータベースに接続で...
-
クラスモジュールを使わないと...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbs: オブジェクトがコレクショ...
-
Perlのライセンス
-
Cからシェルを起動し返り値をハ...
-
cygwinでcshが認識されず困って...
-
パスワードの保存
-
powershellで関数名を変更する...
-
dieによる終了コード(ステータ...
-
perl初心者 「カウンタ」
-
月刊LinuxWorldのめっちゃ便利...
-
ptkdbを使ってCGIプログラムを...
-
UWSCのスクリプトにラグが発生...
-
VBScriptでCurrentDirectoryを...
-
ADサーバにおけるログインID,PC...
-
CGI、このベンチマークは重い?...
-
プログラム初心者です。unix上...
-
perlに特化したエディタご存じ...
-
ちょっとした疑問です
-
Mac OSX 10.6を使っています。
-
頭にperlとつけないと実行できない
-
VBScriptの文字化けについてご質問
おすすめ情報