2010.02.21
expectで楽できたら…
作業してると―――
sshで接続→別のサーバへ接続→更に別のサーバへ…
なんてことはないでしょうか。
接続先にrsh入れることに問題ないのであれば、
それでもいいんですが多くの場合そうもいかず。
大抵は「ログイン用の手順を保存しておいてコピペ」で済ますんですが、
長い人生それすらも煩わしくなる時もあり。
そんな時はコイツで手間を省いてみたりしてます。
【expect】
http://www.linux.or.jp/JM/html/expect/man1/expect.1.html
http://expect.nist.gov/
インストールはyumで大丈夫かと思います。
私自身そもそも「面倒くせぇ(’A`)」から始まったのでw
で、例えば以下をファイルに保存して、
実行件を与えて実行してみると…
※【***】の部分は適宜修正してください
#! /usr/bin/expect
#120秒応答が無ければ終了
set timeout 120#############################
#login(以降はこれをコピペ→ログイン情報調整)
set host 【接続先サーバーIP】
set user 【接続ユーザー】
set pass 【パスワード】
set prpt 【ログイン後のプロンプト】
spawn ssh $user@$host
expect “password:”
send “$pass\r”
expect “$prpt”
#############################制御をユーザーに戻す
interact
はい、ログイン完了。
あとは「########」~「########」の間をコピペすると、
2度3度とsshでログインしてくれます。
実際、どういう処理になっているかというと―――
1.「spawn ssh $user@$host」で、
コマンド「ssh $user@$host」を契機にexpectのプロセスを生成。2.標準出力内に「password:」という文字列がくるまで待ち続ける。
こなければ「set timeout ***」で指定した秒数経過で終了。3.「2」で待っていた文字列が見つかったら、「$pass」+「改行(CR)」を自動で出力。
4.「interact」で制御をユーザーに戻す
のようになっています。
ただ、ココで気になるのは「2」の時点でで、
「記述した文字列と完全一致でないとダメなのか」
「初めてログインした時、証明書云々の入力を求められたら?」
という話ですが―――
———————————–
【before】
expect “password:”
send “$pass\r”
———————————–
【after】
expect {
-re “\[Pp]assword:” {
send “$pass\r”
}
“connecting (yes/no)?” {
send “yes\r”
exp_continue
}
}
———————————–
例えばこのような記述で、
「複数の文字列の指定」「正規表現指定」「もう一度待つ,そのまま進む」
が可能だったりします。
ここまでくると、他のコマンドと合わせることで、
定期的に行う必要のある作業で、
手間を省けるものが結構ありそうだってのは、お解りかと思います。
ちなみに―――
expect -c ”
ecpect \”password:\”
send “$pass\r”
という記述でシェルからも呼べますので、
sed,awkなどと組み合わせてやれば、かなり色々できるかと思います。
(環境構築とかSSL申請時のCSR生成とか)
これでどなたかの日頃のイライラが少しでも減れば幸いかな…っと。
Trackback URL
Comment & Trackback
Comment feed
Comment