2013年11月30日土曜日

[Shell] crontabでシェルスクリプトのexpectコマンドがうまく動かない

リモートサーバにsshログインしたあと、何か操作をするというシェルスクリプトを作ったのですが、ターミナルからは動くのに、crontabからはなぜか上手く実行されないという問題に遭遇しました。

原因は、expectスクリプトの最後が、
interact
となっていたこと。
これを、
expect eof
exit

と直すことで無事動かすことが出来ました。


元のシェルスクリプト(端末で動作)
#!/bin/sh

host="user@host"
pass="password"
command="実行するコマンド"
 
expect -c "
set timeout 10
spawn ssh ${host} ${command}
expect \"Are you sure you want to continue connecting (yes/no)?\" {
send \"yes\n\"
expect \"${host}'s password:\"
send \"${pass}\n\"
} \"${host}'s password:\" {
send \"${pass}\n\"
}
interact
"


修正後のシェルスクリプト(crontabで動作)
#!/bin/sh

host="user@host"
pass="password"
command="実行するコマンド"
 
expect -c "
set timeout 10
spawn ssh ${host} ${command}
expect \"Are you sure you want to continue connecting (yes/no)?\" {
send \"yes\n\"
expect \"${host}'s password:\"
send \"${pass}\n\"
} \"${host}'s password:\" {
send \"${pass}\n\"
}
expect eof
exit
"

参考にしたページ:
crontabでexpectコマンドが動かない

4 件のコメント:

  1. 私も同じ状況になり悩みました。
    こちらの記事に従って、interactをexpect eof; exitに差し替えることで無事解決しました。
    大変助かりました。ありがとうございました。

    返信削除
  2. ありがとうございました。
    悩んでいた現象が回避されました。

    返信削除
  3. 諦めかけていたところ、こちらの記事を拝見して解決しました。
    ありがとうございました。

    返信削除
  4. 数年前の記事ですが助かりました。
    ちなみにJenkinsからシェルスクリプトで実行する際に同じ現象が起きており、これで回避できました

    返信削除

Related Posts Plugin for WordPress, Blogger...