首先我需要說我使用公鑰和私鑰,但這並沒有解決我的問題。另外我知道我可以使用兩個腳本(一個使用password1,另一個使用password2)並運行它們兩次,但我想知道爲什麼下面的腳本不起作用。我試圖讓期望的腳本,將通過SSH連接,並檢查兩個密碼之一是否正確。對於這個我檢查腳本的退出代碼:expect - ssh - 兩個可能的密碼 - 或者如何跳過expect塊並仍然使用發送clausule
- 0 - 密碼1是正確的
- 1 - 密碼2是正確的
- 2,3,4,5,6 - 一些其他的退出代碼,本insipred崗位:expect send weird constructions
可以有遠程機器上更可能的登錄提示,我想使這個腳本儘可能通用,所以我不能依靠登錄提示字符串。到目前爲止,我有這樣的代碼:
#!/usr/local/bin/expect
set username "username";
set remote_server "machine";
set password1 "badpassword";
set password2 "goodpassword";
set timeout 5;
set pretype 0;
set retcode 0;
if { $pretype == 0 } {
spawn ssh -q ${username}@${remote_server}
expect {
"no)?" { send "yes\r"; }
"denied" {
puts "Can't login to $remote_server. Check username and password\n";
set retcode 2;
}
"telnet:" {
puts "Can't connect to $remote_server via SSH or Telnet. Something went definitely wrong\n";
set retcode 3;
}
"failed" {
puts "Host $remote_server exists. Check ssh_hosts file\n";
set retcode 4;
}
timeout {
puts "Timeout problem. Host $remote_server doesn't respond\n";
set retcode 5;
}
"refused" {
puts "Host $remote_server refused to SSH. That is insecure.\n";
set retcode 6;
}
"assword:" { set pretype 1; send "${password1}\r"; }
}
} else {
expect{
"assword:" { send "${password2}\r"; exit 1; }
timeout { exit 0; }
}
}
這背後的想法是:若我輸入密碼錯誤,我將必須鍵入正確的第二次機會。所以,如果我第一次輸入錯誤的密碼,我的腳本應該繼續在其他分支(因爲我set pretype to 1
)。在這裏,我會等待再次輸入密碼。所以我會發送第二個密碼並退出代碼1(密碼2是OK)。如果其他分支中的超時過期(「password:」字符串不匹配),最有可能我已經有登錄提示,所以腳本將退出代碼0(密碼1是OK)。但是這並沒有工作,如果我跑這裏面調試器,我看到的最後一行是:
send: sending "badpassword\r\r" to { exp4 }
我不知道爲什麼會這樣,但似乎從來沒有劇本到達else分支。非常感謝