« 改めてプロジェクト管理を考えてみる | 公開鍵、秘密鍵ってなに? »

2010.02.21

expectで楽できたら…

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをnewsingに追加

作業してると―――

 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

No comments.

Comment feed

Comment





XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>