expect コマンドは、
対話形式のプログラムをスクリプトを通して操作するためのプログラムです。
パスワード入力を求めてくるようなコマンドプログラムを自動化したい場合に使うことが多いと思いますが、応用すれば色々できそうなものです。
インストール方法
インストールの方法は、下記のとおり。
// On Ubuntu
$ sudo apt install expect
// On CentOS
$ sudo yum install expect
// On MacOS
$ brew install expect
基本コマンド
サンプルコードを動かすために覚えておきたい、
最低限の命令だけ記載しておきます。
spawn
対話対象となるプロセスを起動。
このプロセスに対して、出力のパターンマッチ待機(expect)と、入力の送信(send)をする事になる。
キーボード入力が必要なコマンドプログラムや、shellスクリプトだったり、
FTP, Telnet, SSH, SCP,などのプロセスをspawnさせることが多いです。
expect
対象対象となるプロセスからの出力を、パターンマッチングで待機します。
パターンマッチした出力が来た場合か、
タイムアウト(デフォルトで10秒)した場合に、次の命令に進みます。
send
対話対象となるプロセスに、入力を送信します。
エンター入力は、"\r"で表現。
interact
対話対象となっていたプロセス(spawnさせた)を、ユーザーに渡します。
spawnで起動したプロセスは対話対象となり、
出力内容はexpectプログラムによりフックされています。
入力はsendでしか送信することができない状態です。
interact命令を実行すると対話対象からは外れて、
出力は直接ターミナルへ、入力はユーザーのキーボードを読み取る事になります。
簡単なサンプル
sample.expというファイルを作って試してみましょう。
#!/usr/bin/expect
# sshプロセスを起動
# 立ち上げたプロセスが対話対象
spawn ssh wildes@192.168.0.100
# Password: というsshプロセスの出力にマッチ、それかタイムアウトした場合に、次に進む。
expect "Password:"
# sshのパスワードをsshプロセスに送信
send "1234\r";
# 対話対象から外し、入出力をユーザーに渡す。
interact
実行権限を付与して実行してみる。
$ chmod +x sample.exp
$ ./sample.exp
spawn ssh wildes@192.168.0.100
Password:
Last login: Sun Nov 21 15:13:26 2021 from 192.168.0.100
$