本日のまとめ(23:30 ちょっと修正)
expect
スクリプト言語。
対話型CUIアプリの処理を組み込める。
基本的には
expect"文字列"
で指定した文字列が画面に表示されるのを待って、
send"コマンドor入力文字列"
で、コマンドなり文字列なりを渡す。
具体例
telnetでログインしてsu -して設定ファイルに一行加えるスクリプトなら
#!/usr/local/expect
spawn telnet HOSTNAME #spawnが処理開始の合図
expect "login:" #コンソールに"login:"が表示されるまで待つ
send "guest\r" #IDの"guest"を渡す。"\r"は改行コード
expect "password:" #パスワードについても同様の処理
send "GUEST_PASSWORD\r"
expect "$" #guestの入力待ちキャラクタ"$"が出るまで待つ
send "su -\r" #su - を実行
expect "password:"
#やはりコンソールの"password:"という表示を待つ
send "ROOT_PASSWORD\r"
expect "#" #rootの入力待ちキャラクタ"$"を待つ
send "echo 設定項目 >>設定ファイル\r"
#設定ファイルの更新。現在viで編集する方法を模索中
expect "#"
send "exit\r" #シェルを抜ける
expect "$" #rootを抜けてguestに戻ったので今度は"$"
send "exit\r" #ログアウト
interact #spawnにより開始したジョブを終了
exit #スクリプトの終わり
でOK。
変数、ループ
変数は
set 変数名 値
で使えるし、
forループも
for {set i 初期値} {i<終了値} {incr i} {
内容
}
で使えるので便利。
今回の仕事の方針
今回の仕事では、
telnetでログイン→ユーザー追加→設定ファイル記述→ログアウト
の処理をforループで回し、連番になったホストへ順次設定を施すスクリプトを書いた。
連番のホスト名は
append HOSTNAME HOSTNO
とすれば HOSTNAMEにHOSTNOが結合されるのでそれで生成可能。
(ただし、HOSTONAMEはループごとに初期化する必要あり)
設定ファイルは一行追加するだけなら上のようなechoを用いるコードでOK
あとは気合いと運で作成。
引数
もちろん引数も指定可能です。
argvが引数の集合なので、0から順に利用。
set 変数 [lindex $argv 0]
あとはググれば詳しい言語仕様とかも見つかるので適当に。