2010-12-16

Expect コマンドで passwd 変更 (補足)

過去記事の補足。

2009-02-16 の記事において、expect コマンドを使って passwd を変更するサンプル・スクリプトを紹介した。

#!/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
"

そしたら、最近、こんなコメントが入った [Thanks anonymous]。

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

ほほう。これは知らなかった。改めて expect コマンドのマニュアルを読んでみた。

send [-flags] string

send コマンドはオプションとしてフラグを取ることができる。このフラグは「-」で始まるから、今回の場合、パスワードの先頭に「-」を入れるとフラグと解釈される。これは、ぼくの期待した動きではない。

更にマニュアルを読むと次のようにある。

The -- flag forces the next argument to be interpreted as a string rather than a flag.

-- というフラグを入れると、残りの引数を文字列として受け取ってくれるとのこと (フラグと認識しなくなる)。

今回の事例では、パスワードの先頭に「-」が来ても良いよう配慮しておくことが良さそう。というわけで、上記 expect コマンドのサンプル・コードは次の様に書き換えられる:

#!/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
"

2 comments:

  1. 自作のexpectを利用した自動化スクリプトでたまーに出るbad flagエラーで悩んでおりましたが、疑問氷解いたしました。
    ありがとうございます。

    ReplyDelete
    Replies
    1. コメントありがとうございます。
      記事が役に立って良かったです :)
      expect のこの一件はハマリ所ですよね。

      Delete