![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
ブラウザでユーザー名とパスワードを入力して
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で質問しましょう!
似たような質問が見つかりました
- PHP php ログイン 1 2022/11/01 00:24
- JavaScript HTMLでJavaScriptを使用してプログラムを作ります。 入力されたパスワードを取得して、パス 2 2022/10/18 01:05
- その他(開発・運用・管理) Windowsバッチファイルでリモートデスクトップを自動ログインするが確認画面が出る対処方法 1 2022/12/19 15:48
- その他(ブラウザ) ・再投稿です 自分のデフォルトゲートウェイをアドレスバーに入力し、Enterキーを押します。(一般的 1 2022/05/30 23:16
- その他(ブラウザ) 自分のデフォルトゲートウェイをアドレスバーに入力し、Enterキーを押します。(一般的なデフォルトゲ 4 2022/05/30 22:43
- UNIX・Linux ubuntuに外部侵入できるか 2 2022/04/09 12:48
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- UNIX・Linux AWSのEC2のZabbixユーザーでawscliコマンドが実行できない状態を解決する 1 2022/12/06 22:17
- iPhone(アイフォーン) iPhone7 標準メールアプリでicloud.com のメール設定が出来ない。助けてください! 3 2022/08/17 13:04
- Excel(エクセル) パスワード付きExcelブックについて 4 2022/06/02 21:34
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ディスクの空き容量を求める(W...
-
Perlのライセンス
-
複数行に渡る文字列の置換
-
VBScriptでCurrentDirectoryを...
-
頭にperlとつけないと実行できない
-
Windows系OSのPerlスクリプト...
-
PerlでUNIXのコマンドとパスワ...
-
[ASP]条件によってインクルード...
-
vbs: オブジェクトがコレクショ...
-
crontab での実行結果が違う
-
ホームページ作成でCGI、VBスク...
-
powershellで関数名を変更する...
-
VBAで別モジュールへの変数の受...
-
VBAで旧字体を異字体に一括で変...
-
例外処理のフローチャートの記...
-
VBAで「メモリが不足しています」
-
VBA This Workbookモジュール...
-
LCD ディスプレイを Raspberry ...
-
オフコン(富士通Kシリーズ)...
-
ユーザー定義関数に#NAME?が返...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Cからシェルを起動し返り値をハ...
-
powershellで関数名を変更する...
-
UWSCのスクリプトにラグが発生...
-
"JScript"が見つかりません!
-
[ASP]条件によってインクルード...
-
VBSで自動ログインについて
-
VBSを利用して、IEのタブを自動...
-
VBScriptでCurrentDirectoryを...
-
Perlのライセンス
-
vbs: オブジェクトがコレクショ...
-
Perlスクリプトで文字化けして...
-
シェルでsyntax errorがでてしまう
-
awkの処理速度を改善したい
-
ADサーバにおけるログインID,PC...
-
cygwinでcshが認識されず困って...
-
ディスクの空き容量を求める(W...
-
crontab での実行結果が違う
-
ホームページ作成でCGI、VBスク...
-
perlスクリプトのブラウザURLか...
-
perl起動方法
おすすめ情報