本日のまとめ(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
 
あとは気合いと運で作成。
 

実行方法

bashスクリプトとかと基本は同じ。

chmod +x filename

で実行権限を与えて
./filename
でOK
 

引数

もちろん引数も指定可能です。
argvが引数の集合なので、0から順に利用。

 set 変数 [lindex $argv 0]

 
あとはググれば詳しい言語仕様とかも見つかるので適当に。