私の目標は、SFTPサーバーでファイルの名前を変更するために使用し、名前の変更に失敗した場合はステータスコード1で予想を終了することです。
私の予想されるスクリプトはうまくいきます。名前が正常に変更されました。
名前の変更に失敗した場合、ステータスコードで終了する方法はわかりません。
ubuntu@ip-10-0-0-138:~$> cat expect_script.txt
spawn sftp -o "StrictHostKeyChecking no" [email protected]
expect "password:"
send "somesupersecretpassword\n"
expect "sftp>"
send "rename /var/www/static/tmp-93121715.mp4 /var/www/static/91329728.mp4\n"
expect "sftp>"
send "rename /var/www/static/91329728.mp4 /var/www/static/tmp-93121715.mp4\n"
expect "sftp>"
send "bye\n"
expect "#"
exit
スクリプト実行時の出力は次のとおりです。
ubuntu@ip-10-0-0-138:~$> expect -f expect_script.txt
spawn sftp -o StrictHostKeyChecking no [email protected]
[email protected]'s password:
Connected to nginx.localvpc.
sftp> rename /var/www/static/tmp-93121715.mp4 /var/www/static/91329728.mp4
rename /var/www/static/tmp-93121715.mp4 /var/www/static/91329728.mp4
sftp> rename /var/www/static/91329728.mp4 /var/www/static/tmp-93121715.mp4
rename /var/www/static/91329728.mp4 /var/www/static/tmp-93121715.mp4
sftp> bye
bye
ubuntu@ip-10-0-0-138:~$>
名前の変更が失敗した場合、戻りコード0で終了するために私ができる方法を提案できる人はいますか?
追加の質問...予想されるスクリプトの最後で終了する正しい方法は何ですか?そのうちの一つですか?
exit
close
expect eof
ありがとうございます!
答え1
そのテキストを一致させ、それを操作して名前変更の失敗を確認する必要があります。これは抽象化できますproc
(TCLではこれをサブルーチンまたは関数と呼びます)。
spawn ...
set ret 0
expect "sftp>"
proc sftp_rename {from to} {
global ret
send "rename $from $to\n"
expect {
-ex "Couldn't" { set ret 42; exp_continue }
"sftp>"
}
}
sftp_rename /var/www/static/tmp-93121715.mp4 /var/www/static/91329728.mp4
sftp_rename /var/www/static/91329728.mp4 /var/www/static/tmp-93121715.mp4
send "bye\n"
expect eof
exit $ret
その頃は接続が消えるとexpect eof
予想しているので使用します。sftp
答え2
私のマニュアルページは次のようにexpect
言います。
exit [-opts] [status]
[...]ステータス(指定されていない場合は0)はExpectの終了ステータスとして返されます。
だからあなたはただexit 1
。
3つのオプションは、EOFに到達するためにexpect eof
コマンドがexpect
渡されるのを待ちます。expect
後でスクリプトを続行できます。expect eof
これはオプションの1つだけであるか、リモコンが切断を検出してエラーとして扱うことができる状況で役立ちます。 (もちろん、会話を交わす両側とも相手が止まるまで待つと問題が発生します。)
close
他のプロセスへの接続を閉じるので、ある意味ではexpect eof
。close
スクリプトを終了する前にこれを使用すると、exit
willも暗黙的に使用されるため、多くのことは行われませんclose
。
exit
その後、スクリプトを終了します。 3つの選択肢は、実行したい操作によって異なります。終了したい場合は、単に話し、exit
リモコンにEOFを処理させるようにしてください。