我希望期望腳本啓動ssh會話,如果詢問您是否確定,會自動回答「yes」,然後在密碼提示處暫時將交互傳遞給用戶,以便他們輸入密碼,然後在檢測到用戶點擊回車後將其取回。噢,如果有3秒的超時,並且在fileServer上的ssh服務器尚未啓動的情況下連續重試。期望腳本錯誤,期望超時,exp_continue或多個期望的可能性
1: expect "root*archiso*# "
2: puts "\n<<< Make sure sshd is started on fileServer >>>\n"
3: set readyForPassword 0
4: while { $readyForPassword == 0 } {
5: send "scp [email protected]:/public/* /publicCopy\n"
6: expect -timeout 3 {
7: "Are you sure you want to continue connecting (yes/no)? " {
8: send "yes\n"
9: exp_continue
10: } "password: " {
11: set readyForPassword 1
12: }
13: }
14: }
15: interact "\n" return
16: send "\n"
我認爲代碼將要做的事如下。第6行將在「您確定要繼續連接(是/否)?」還是「密碼:」中尋找匹配項。如果在3秒後超時,while循環將重新啓動,並且scp
將再次嘗試。如果它匹配前一行,它將發送「是\ n」,併爲「密碼:」再尋找3秒鐘。如果它第一次或者在發送「是」之後匹配「密碼:」,它將退出while循環。
第15行會讓用戶輸入密碼,當按下Enter時,控件將返回到期望腳本。用戶的輸入沒有發送,所以發送一個輸入。
我的理解很明顯。 sshd在fileServer上啓動,因此它立即進入密碼提示。如果我什麼都不做,在3秒鐘內,它會爲我輸入。然後它每秒輸入一次,直到第三次失敗,當scp中止。然後,它再次嘗試scp,永遠重複這個過程。因此,顯然,readyForPassword永遠不會設置爲1.
這種類型的while/readyForPassword循環在我的代碼中的其他位置工作,所以它與timeout,exp_continue或處理期望的多種可能性有關 - 這些是這部分代碼中的新東西給我。
如果exp_continue沒有重新評估包括「password:」在內的新文本,我想知道是否在發送「是\ n」之後,當觸發「password:」時發送。但是,如果是這樣的話,我不知道如何解決它。
另外,我認爲這不僅僅是爲我輸入密碼,我非常肯定它將發送scp行作爲密碼。
我沒有看到你的'spawn'你的代碼中的任何進程。你需要產生一個過程,以期望控制它。 –