expect コマンド
お兄ちゃん!
シェルスクリプトに
「対話的」なコマンドがあると
自動化がしにくいよ!
問い合わせが来るから
そこで手を止めないと
いけなくなっちゃうんだ!
対話的なコマンドは
入力リダイレクトやパイプから
自動化できる場合があるよ
以下は
yes を使った例だよ
yes | 対話的なコマンド
でも一部のコマンドは入力リダイレクトやパイプからの入力を拒否するんだそのようなコマンドに
passwd や ssh などがあるよexpect はそのような入力を拒否する対話的コマンドでも対話を自動化できるようにしてくれるんだ!今回は
expect を使って対話的なコマンドの対話を自動化しよう!expect は対話的なプログラムのやりとりを自動化してくれるツールだよexpect [オプション]... [引数]...
expect はスクリプト言語なんだシェルスクリプトのようにexpect コマンドを書いていきそれを実行することで対話を自動化してくれるんだexpect 独自のコマンドを覚える必要があるのね…expect のコマンドはたくさんあるけどいくつかを覚えれば十分自動化できるんだ最初は以下を覚えよう!expect コマンド | 役割 |
|---|---|
spawn コマンド | コマンド を expect の管理下で実行する |
sleep 秒数 | 秒数 間待機する、 |
expect 文字列 | expect 管理下のコマンドが指定された文字列を出力するまで待機する |
send 文字列 | expect 管理下のコマンドに文字列を送る |
wait | expect 管理下のコマンドが終了するまで待機する |
close | expect 管理下のコマンドを終了する |
説明だけだと使いこなせる気がしないよ実例が見てみたいなぁ
それでは
expect でpasswd の対話を自動化してみよう!USERNAME=midori
sudo expect << EOF
spawn passwd "$USERNAME"
expect "New password:"
send "$USERNAME\r"
expect "Retype new password:"
send "$USERNAME\r"
wait
EOF
最初の1行で変数を定義している以外は
expect の処理だよ!expect の前にsudo ってあるね?確か管理者権限でコマンドを実行だったはずだけど…他人のパスワード変更は管理者の仕事なので
sudo が必要なんだ詳しくは管理者を説明するときに話すねexpect のヒアドキュメントの内容がexpect スクリプトになっているんだね!ここで自動化の指示をしているんだ!そういうことだよ
expect スクリプトの内容を1行ずつ読み解いてみよう最初の行はどういう意味かな?spawn passwd "$USERNAME"
spawn はexpect 管理下でコマンドを実行」USERNAME 変数にはmidori が入っているからこれは passwd midori を実行してくれるんだ!passwd の引数にユーザ名を指定するとそのユーザのパスワードを変更するよつまり passwd midori でmidori ユーザのパスワード変更なんだこれで passwd コマンドがexpect の管理下で実行されるよさて…その次の行はどうだろう?
expect "New password:"
expect はpasswd がそういうことだね!待ち受けメッセージが表示されてからパスワード入力を受け付けるのでそれが表示されるまでは待機しているんだ
さらにその次はどうかな?
send "$USERNAME\r"
send はUSERNAME 変数の値midori を送って…えっと…最後の
\r はなんだろうね?これは 「改行」を表す記号だよ
expect でなるほど!それなら「New Password:」と 待ち受けメッセージが表示された後に文字列 「改行」を 送信しているんだ!
midori とそうそう!これで最初の「New Password:」の 入力を自動化しているんだ
次の2行もこれまでと同じ挙動だね
expect "Retype new password:"
send "$USERNAME\r"
うん!入力パスワードの確認も同様に自動化しているんだね!
次で
expect スクリプトの記述は最後だねwait
passwd が終了するまで待機しているんだ!おつかれさま!これで
expect を使ったpasswd の対話の自動化が終わりだよ今回は
expect を使って対話的コマンドの対話自動化を学んだよ!対話的なコマンドを入力リダイレクトやパイプで自動化できなければ
expect の出番だよ!