Unix でパスワード変更するには、passwd コマンドを使う。
ところが、この passwd コマンドは対話式なのでシェル・スクリプトの中に埋め込むのが難しい。Linux の管理者として、複数のユーザー・アカウントを発行したり変更する時に、これは少々まずい。100 人もの passwd 変更を対話式に入力するのは、Unix 使いのすることじゃない。
expect
この手の対話式スクリプトを shell script 的に対処するために、expect コマンドってのがある。対話文字列にマッチしたら、予め用意したコマンドを送り込んでくれる。
例えば、passwd コマンドなら、こんな対話になる。
$ sudo LANG=C passwd foobar Enter new UNIX password: Retype new UNIX password:
最初の「Enter」に反応してパスワードを、次の「Retype」に反応して確認用パスワードを送るには、こんなスクリプトを書く。
#!/bin/sh user=$1 password="foo" passwd="passwd" expect -c " spawn $passwd $user expect Enter\ ; send $password; send \r expect Retype\ ; send $password; send \r; expect eof exit 0 "
最後の「expect eof exit 0」ってのを忘れてて、ハマった。
コメントのアドバイスに従って、Expect コマンドで passwd 変更 (補足) というエントリーを書きました。どうぞ、補足記事も参照して下さい。
このスクリクトを例えば auto-passwd とか名前を付けたら、コマンド・プロンプトから呼ぶ。
$ for i in foo bar hogehoge...; do sudo auto-passwd $i; done
ユーザー・リストはファイルで与える方が楽でせうね。
システムによっていろいろだと思いますが、debian や ubuntu だとchpasswd とかが使えると思いますよ。
ReplyDeleteおおお。こんなコマンドがあったとは! rok さん、ありがとうございます!!
ReplyDeletesend $password;の部分は send -- $password;にした方が良いです。パスワードの先頭に-を入れられるようになります。
ReplyDeleteこんにちは。
ReplyDelete良い情報なので、記事を修正せず、改めてエントリーを書こうと思います。コメント & 情報ありがとうございます。
Anonymous さん、遅くなりましたが補足記事を書きました。コメントありがとうございます。
ReplyDelete● clmemo@aka: Expect コマンドで passwd 変更 (補足)