expectコマンドtips

対話的なコマンドを自動で行わせるためのコマンドとしてexpectというのがある。で「予期」している文字列パターンを正規表現で行うにはexpectコマンド「内部」のexpectコマンドに-reオプションをつける必要がある。

以下では、「リモートホスト名」のホストにsshでログインし、uname -aを発行してexitとするという単純なプログラム。

$ cat expect-test.sh
#!/bin/sh

/usr/bin/expect -c "
set timeout 10
spawn ssh リモートホスト名
expect -re \".* password:\"
send \"パスワード\"
send \r
expect -re \".*> \"
send \"uname -a\"
send \r
expect eof exit 0
"
$ sh expect-test.sh
spawn ssh リモートホスト名
kohchi@リモートホスト名's password: 
Last login: Sat Apr 12 14:42:28 2014 from 自分のFQDN

kohchi@リモートホスト名:~> uname -a
Linux リモートホスト名 2.6.32.61-smp #1 SMP Wed Jul 10 20:34:58 JST 2013 i686 GNU/Linux
$

パスワードプロンプトとシェルプロンプトを正規表現で待ち受ける。なお、文字列が決まっていれば-reをつけずにそのままその文字列を記載すればいいだけ。

Linuxだけかと思ってたがMacOS Xにもインストールされていた。