我正在努力解決在ssh中自動輸入密碼的經典問題,並像 其他人一樣,我在黑暗中磕磕絆絆地期待着。最後,我拼湊了一個腳本,還挺工作:退出期望{}沒有超時
#!/usr/bin/expect -f
# command line args
set user_at_host [lrange $argv 0 0]
set password [lrange $argv 1 1]
set timeout 1
# ssh command
spawn ssh -S ~/.ssh/tmp.$user_at_host -M -N -f $user_at_host
# deal with ssh prompts
expect {
"*yes/no*" { send "yes\r" ; exp_continue }
"*assword:" { send "$password\r" ; exp_continue }
}
此腳本終止只感謝timeout 1
線,沒有它,它只是掛起,並且只能通過用戶交互(^C
)終止。
當spawn
行是一個簡單的ssh命令時,腳本立即終止,但是這是not your straight forward ssh。可能不同的是-f
選項,它使它在後臺運行(但我嘗試了腳本沒有它無濟於事)。
,我讀了interact
或expect eof
可能有幫助,但我沒能找到正確的咒語,將真正做到這一點。
我的問題(我認爲)是如何使期望腳本,產生後臺進程,終止沒有超時?
編輯:我應該預期(沒有雙關語意)的「使用密碼的ssh認證」的答案。雖然這是一個很好的建議,但它並不是我的方案中的適當解決方案:在受信任的環境中自動測試安裝了vanilla的系統,其中將可信密鑰添加到映像是不可取/可能的。
有沒有辦法之後'*密碼才能退出:'?當我試圖用其他任何東西代替'exp_continue'時,它立即退出,但似乎沒有'發送''$ {密碼}'。 – 2010-06-29 14:43:39
也許一個'睡眠1'或'期待eof'或'wait'? – 2010-06-29 16:20:27
對不起,我正在拼命掙扎,也許你可以幫我減少我必須測試的排列次數:應該等待eof /睡眠1在'expect {...}之內還是之外「 '「循環」? – 2010-06-29 16:35:19