SSHで遠隔操作を自動化する方法(expect)

シェルあんまりやったことないので記録残しておく。

やりたいことは、リモートのサーバーにあるシェルスクリプトを叩いて即exitするというヒット&アウェイなプログラムの作成。


どうやら、expectというものを使うのが普通らしい。

どこを検索してもだいたい「expectは対話型の処理を自動化するためのツールだよ。」と書かれています。

ふむふむなるほど。

とりあえずおもむろにyumを叩いてみると、インストール出来そうだったのでそのまま進みます。

yum install expect

使い方の特徴としては、 全てのコマンドはexpectの中で行われる ということ。

expectというシェルを使ってるイメージですかね。

覚えなきゃいけないのはこの5つぽい。

  1. set timeout

    秒数でタイムアウトを指定。-1だとタイムアウトさせない設定になる。

  2. spawn

    自動で実行したい対話型のコマンド(sshなど)

  3. expect

    コマンド実行後に返却される文字列を正規表現で比較する。

    一致するまでその後の命令は実行されない。

  4. send

    実行したいコマンドなど。

    最後に \n をつけてないとEnterしたことにならない。

  5. interact

    自動実行を終了して、spawnしたコマンドを引き続き操作できるようになる。

    sshしてたら、sshを終了せずにそのままの接続を利用できる。

ということで、早速作ってみる。

#!/bin/sh
echo "自動接続を開始するよ!"

expect -c "
set timeout 10
spawn ssh MYNAME@MYHOST
expect \"s password:\"
send \"MYPASSWORD\n\"
expect \"~]\"
send \"sh /home/test/test.sh\n\"
expect \"~]\"
send \"echo 切り捨て御免!\n\"
expect \"~]\"
send \"exit\n\"
expect \"~]\"
"
echo "自動接続が終了したよ!"

このプログラムでは、ssh で MYNAME@MYHOST へ接続し、/home/test/test.sh を叩いて逃げます。簡単ですね。実働環境で無駄にcron増やしたくないときとか使えそうです。

色々調べましたが、こちらのサイトが一番参考になりました。どもです。

【linux豆知識】自動化といえばコレ!expectの使い方・変数の扱い