2009-02-16

Expect コマンドで passwd 変更

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

ユーザー・リストはファイルで与える方が楽でせうね。

5 comments:

  1. システムによっていろいろだと思いますが、debian や ubuntu だとchpasswd とかが使えると思いますよ。

    ReplyDelete
  2. おおお。こんなコマンドがあったとは! rok さん、ありがとうございます!!

    ReplyDelete
  3. send $password;の部分は send -- $password;にした方が良いです。パスワードの先頭に-を入れられるようになります。

    ReplyDelete
  4. こんにちは。
    良い情報なので、記事を修正せず、改めてエントリーを書こうと思います。コメント & 情報ありがとうございます。

    ReplyDelete
  5. Anonymous さん、遅くなりましたが補足記事を書きました。コメントありがとうございます。

    clmemo@aka: Expect コマンドで passwd 変更 (補足)

    ReplyDelete