2015-12-21 158 views
0

我希望期望腳本啓動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行作爲密碼。

+0

我沒有看到你的'spawn'你的代碼中的任何進程。你需要產生一個過程,以期望控制它。 –

回答

1

您應該使用回車符\r來匹配用戶的「輸入」鍵輸入,而不是換行\n字符。改變它,

interact "\r" return 
send \r 
expect "root*archiso*# " 

此外,建議使用\r始終,而不是\n

+0

我對EOL的預期有點困惑。謝謝,我會改變這些。我不認爲這涉及我遇到的問題,但是,應該如何?我將在大約10個小時內再次進入機器,但我不認爲執行會進入互動線路。 – user1902689

+0

如果沒有,則添加'exp_internal 1'並共享調試日誌。 – Dinesh