遠隔サーバにてコマンドを自動実行するにあたり必要になったのでメモ
connect.sh
#!/bin/bash
# 接続先情報
SSH_USER=work
SSH_PASS=hoge
SSH_HOST=localhost
REMOTE_CMD=$1
# 後述のSSH_ASKPASSで設定したプログラム(本ファイル自身)が返す内容
if [ -n "$PASSWORD" ]; then
cat <<< "$PASSWORD"
exit 0
fi
# SSH_ASKPASSで呼ばれるシェルにパスワードを渡すために変数を設定
export PASSWORD=$SSH_PASS
# SSH_ASKPASSに本ファイルを設定
export SSH_ASKPASS=$0
# ダミーを設定
export DISPLAY=dummy:0
# SSH接続 & リモートコマンド実行
RET=`exec setsid ssh $SSH_USER@$SSH_HOST $REMOTE_CMD`
echo $RET
shellで実行
$ ./connect.sh "date"
crontabで実行
chmod +x connect.sh
*/1 * * * * /home/hoge/connect.sh "date" >> /home/hoge/resalt.log
活用
command.sh
/home/work/connect.sh 'date' >> /home/work/date.log
/home/work/connect.sh 'ls -la |grep "data.log"' >> /home/work/file.log
備考
・expectコマンドは、バックグラウンドで実行されるような場合には利用できない(cronなど)
・このような場合にはssh_askpassを利用する