2011年5月10日火曜日

expectを利用してscpを自動化


expectを利用してscpを自動化するshツール。
パスフレーズなしscpでいいのだろうが、
どうしてもパスフレーズを入力しなければいけない場合用に。
エラー処理などしっかりと実施していないが、とりあえずこれで動作する。

引数は5つ。
/usr/local/bin/scp.sh [HOST] [USER] [PASSWORD] [SOURCE] [DEST]
と実行すればよい。


#!/bin/sh

if [ $# != 5 ];then
  echo './scp.sh [HOST] [USER] [PASSWORD] [SOURCE] [DEST]'
  exit 1
fi

HOST=$1
USER=$2
PASSWORD=$3
SOURCE=$4
DEST=$5

TIME=800

/usr/bin/expect -c"
  set timeout ${TIME}
  spawn /usr/bin/scp -r ${USER}@${HOST}:${SOURCE} ${DEST}

  expect {
    \"Are you sure you want to continue connecting (yes/no)?\" {
     send \"yes\n\"
     expect \"password:\"
     send \"${PASSWORD}\n\"
    } \"password:\" {
    send \"${PASSWORD}\n\"
    }
  }

expect
"

exit 0


(補足)
expect内でinteractも使えるけれど、
これを使うと制御端末のないcron経由の実行ができないので注意を。

(関連)
rubyのexpectモジュールを使って任意のコマンドを発行
sshで多段接続をしてscp