我習慣於在腳本中編寫所有Expect的東西。這有助於調試並增加更多的可讀性。
在期待,你可以隨時添加一個「超時」每個希望處理異常。當預期模式不匹配時,可以通過一些消息來通知情況。以SSH例如:
spawn ssh [email protected]
expect {
"Password:" {send "user123\n"; exp_continue}
timeout {send_user "connection fail\n"; exit}
-ex "$"
}
在任何模式都不匹配,預計將運行timeout
塊,並顯示「連接失敗」。
如果我是你,我會把複雜的ssh命令分成許多簡單的命令。即首先將ssh發送到服務器,處理登錄過程,然後執行chown內容。該腳本看起來像:
# login
spawn ssh [email protected]
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 "$"
}
記住,在大多數情況下,預計一無所知如果命令的成功與否。腳本必須通過預期輸出字符串來檢查自身,並處理每種情況。
對於你的情況,我覺得有一種簡單的方式通過$的值來檢查命令?如果你將原始命令分成小塊。
# 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}
}
希望這會有所幫助。