それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

コマンドを自動化する expect

今更だけどexpect を使ったのでメモ

EXPCETとは

EXPECTは、Bashの対話プロンプトに自動入力するソフトウェア。
特定の文字列を見つけると,入力する。

なぜ expectなのか

rsync のファイルを自動化したかった・・・・しかし、公開鍵(id_rsa.pub) が使えない。。RsyncをCronで自動実行しようとしたらパスワード入力がネックになって自動起動しない。で詰んだ。

仕方ないので expect で自動実行をすることに。

Expectインストール

Ubuntuではデフォルトインストールされていなかったので。

sudo aptitude install expect

Exceptコマンドを使う。

今回はExpectをつかってRsyncの起動。

rsync_example.la
  1 #!/usr/bin/expect
  2
  3 #タイムアウト
  4 set timeout 5
  5 # rsync 起動
  6 spawn rsync -rltDvz --progress --partial --bwlimit=250 example.la:/mnt/comics/ /mnt/example.la
  7 #パスワード入力
  8 expect "takuya@example.la's password:"
  9 send "PASS_WORD\n" # ここでパスワードを入れる
 10
 11 interact

起動

chmod +x rsync_example.la
./rsync_example.la

これで自動的に入力が始まってくれる

解説

spawn コマンド
コマンドに実行したいコマンドを入れる
expect "文字列"
文字列に、プロンプトを指定する。ここで指定した文字列が来たら,すかさず文字入力。


簡単です。

感想とか

SSHなら、expectを使わず、Ruby/PythonなどのSSHライブラリを使うべきだし。パスワードではなく証明書ログインをするべき。証明書ログインは証明書のパスフレーズが必要だけど。バッチ用に権限を制御した証明書作ればいいし(これはそのうち)

ちなみにApacheSSLパスフレーズとかでも使うべきではないです。あれはApacheSSLの設定でファイルから入力できます。

でもレンタルサーバーとかでどうにもいかない時に便利です。