私はスクリプトですべての Expect のものを書くことに慣れています。これにより、デバッグが容易になり、読みやすくなります。
Expect では、いつでも、例外を処理する各 Expect に「タイムアウト」を追加できます。期待されるパターンが一致しない場合、状況を知らせるメッセージを入れることができます。たとえば、ssh を使用します。
spawn ssh user@192.168.1.1
expect {
"Password:" {send "user123\n"; exp_continue}
timeout {send_user "connection fail\n"; exit}
-ex "$"
}
どのパターンも一致しない場合、Expect はtimeout
ブロックを実行し、「接続失敗」を表示します。
私があなたなら、複雑な ssh コマンドを多くの単純なコマンドに分割します。つまり、最初にサーバーに ssh し、ログイン プロセスを処理してから、chown 処理を行います。スクリプトは次のようになります。
# login
spawn ssh user@192.168.1.1
expect {
-ex "(yes/no)?" {send "yes\n"; exp_continue}
"Password:" {send "user123\n"; exp_continue}
timeout {send_user "connection fail\n"; exit}
-ex "#"
}
# do chown
send "chown -R user /usr\n"
expect {
"No such file or directory" {send_user "No such file or directory\n"; exp_continue}
"Operation not permitted" {send_user "Operation not permitted\n"; exp_continue}
"invalid user" {send_user "Invalid user name\n"; exp_continue}
-ex "$"
}
ほとんどの場合、Expect はコマンドが成功したかどうかについて何も知らないことに注意してください。スクリプトは、出力文字列を期待して自身をチェックし、それぞれの状況を処理する必要があります。
あなたの場合、 $? の値でコマンドを確認する簡単な方法があると思います。元のコマンドを細かく分割した場合。
# after ssh login, do chown
send "chown -R user /usr\n"
expect -ex "$"
send "echo rv: $?\n"
expect {
"rv: 0" {send_user "command successed\n"}
timeout {send_user "command failed: $expect_out(buffer)\n"; exit}
}
お役に立てれば。