はじめに
自動化を実装する際のよく起こる課題の一つに、対話処理をどう自動化するかと言う課題があるかと思います。そんな時よくexpectと呼ばれるインタプリタが使われるのですが、今回はこれを使ってリモートホストでコマンド実行を自動化したいと思います。
expect
とりあえずログイン時のパスワード入力を自動化したいと思います。標準出力の特定の文字列に反応して対話処理を自動化していくものと考えてください。
$ cat ssh.sh
#!/bin/bash
TAR="【ユーザ名】@【ホスト名】"
PW="【パスワード】"
expect -c "
set timeout 5
spawn env LANG=C /usr/bin/ssh ${TAR}
expect \"password:\"
send \"${PW}\n\"
interact
"
11行目のinteract
コマンドを投入する事で、プロセス制御ユーザーに渡しています。タイムアウトは5秒に設定していますが、タイムアウトしない場合は-1を設定します。実行するとパスワードを自動で入力しそのままログイン出来るはずです。
続いてリモートホストにログインして、何かスクリプトを実行した後、リモートホストを抜けるexpect
を作りたいと思います。てきとうなスクリプトとして今回は以前作成した音楽再生スクリプトplay.sh
を使用します。読むのが面倒な場合は環境に合わせて簡単なスクリプトを作成して下さい。
$ cat play.sh
#!/bin/bash
TAR="【ユーザ名】@【ホスト名】"
PW="【パスワード】"
expect -c "
set timeout 5
spawn env LANG=C /usr/bin/ssh ${TAR}
expect \"password:\"
send \"${PW}\n\"
expect \"$\"
send \"nohup /bin/bash play.sh &\n\"
expect \"$\"
send \"exit\n\"
exit 0
"
12行目でリモートホストへのログインが成功した際に、送信したコマンドを定義します。コマンドを実行した後リモートホストからログアウトしたいので再度、13行目でプロンプトが返った事を検知してから、14行目でexit
を送信します。15行目ではexitプロセス自体を終了して完了です。以上です。