サーバにログインして、定期的にいくつかのコマンドを実行しなければいけない業務がある場合、 簡単なスクリプトを作成して、そのスクリプトコマンド1つだけを実行すれば 作業が完了するようにしたいものです。しかし、そのスクリプトを書く作業も自動化したくないですか?
Expect は、スクリプトの指示に従って、コマンドの返答(yes や no, パスワード入力待ちなど)を識別して 対話的なプログラムと会話を行ってくれるプログラムです。
相手のプログラム、サービスが、ok と返したらこの処理、ng と返したらこの処理を実行と、 相手のプログラムの応答により処理を分ける事が出来る。
コードを書こうとすると少しExpect の学習をしなければいけないが、決まった処理を行いたい場合は、 autoexpectコマンドで実行したい処理を自動生成できる。
expectは、次のコマンドを実行するとインストールできます。
$ sudo apt install expect
utoexpect の実行例を紹介します。
これは、tmpディレクトリにある、test1,test2,test3のファイルを削除しようとすると、 rmコマンドが削除確認の応答を返すので、[y]を入力してファイルを削除しなければいけないのを expectに自動で行わせる為のスクリプトを自動生成しています。
tmpディレクトリにテストファイルを作成します。
$ touch /tmp/test1 /tmp/test2 /tmp/test3
-f オプションで example.exp ファイルに実行した処理を保存します。
$ autoexpect -f example.exp
autoexpect started, file is example.exp
tmpディレクトリに移動して,ls コマンドでtestファイルの存在を確認、
ファイルを削除の確認が促されるのを[y]を入力して削除します。
$ cd /tmp/
$ ls test*
test1 test2 test3
$ rm -i test*
rm: 通常の空ファイル 'test1' を削除しますか? y
rm: 通常の空ファイル 'test2' を削除しますか? y
rm: 通常の空ファイル 'test3' を削除しますか? y
exit でautoexpectを終了すると、example.expに操作したデータが保存されます。
$ exit
autoexpect done, file is example.exp
もう一度tmpディレクトリにテストファイルを作成します。
$ touch /tmp/test1 /tmp/test2 /tmp/test3
先ほど作成した、example.exp を実行すると、同様の操作をexample.expコマンド1つで実行してくれます。
$ ./example.exp
spawn /bin/bash
$ cd /tmp/
$ ls test*
test1 test2 test3
$ rm -i test*
rm: 通常の空ファイル 'test1' を削除しますか? y <- y[Enter] の操作は、expect が自動で行ってくれます。
rm: 通常の空ファイル 'test2' を削除しますか? y
rm: 通常の空ファイル 'test3' を削除しますか? y