ブラウザでユーザー名とパスワードを入力して
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を探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/6】 西暦2100年、小学生のなりたい職業ランキング
- ・ちょっと先の未来クイズ第5問
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlスクリプトで文字化けして...
-
powershellで関数名を変更する...
-
VBSを利用して、IEのタブを自動...
-
Cからシェルを起動し返り値をハ...
-
VBScriptでCurrentDirectoryを...
-
ADサーバにおけるログインID,PC...
-
Perlのライセンス
-
UWSCのスクリプトにラグが発生...
-
例外処理のフローチャートの記...
-
Workbook.BeforeSave イベント...
-
Excel VBAでリンク切れをチェッ...
-
VBSがコンパイルエラーになりま...
-
VBのフォームモジュールと標準...
-
Excel VBAで、ユーザーフォーム...
-
Access VBA標準モジュールにつ...
-
「デバイスは PRN を初期化でき...
-
Tomcat マイナーバージョン移行...
-
大量の標準モジュールを解放す...
-
【超初心者】異なるディレクト...
-
vba userFormのSubを標準モジュ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
powershellで関数名を変更する...
-
UWSCのスクリプトにラグが発生...
-
Cからシェルを起動し返り値をハ...
-
VBSを利用して、IEのタブを自動...
-
VBScriptでCurrentDirectoryを...
-
Perlのライセンス
-
スクリプトを使い、自動にリネーム
-
Linuxのcronとrc.localでの制御...
-
シェルでsyntax errorがでてしまう
-
Postfixでメールを受信したらPe...
-
ADサーバにおけるログインID,PC...
-
cygwinでcshが認識されず困って...
-
[ASP]条件によってインクルード...
-
PerlでUNIXのコマンドとパスワ...
-
perlスクリプトのブラウザURLか...
-
DBファイルが0644になってしまう
-
VBSで自動ログインについて
-
rshを使うスクリプトをバックグ...
-
CシェルプログラミングをCygwinで?
-
cronでのPerlスクリプト実行
おすすめ情報