過去記事の補足。
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 "
自作のexpectを利用した自動化スクリプトでたまーに出るbad flagエラーで悩んでおりましたが、疑問氷解いたしました。
ReplyDeleteありがとうございます。
コメントありがとうございます。
Delete記事が役に立って良かったです :)
expect のこの一件はハマリ所ですよね。