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
の出番だよ!