2011-06-14 49 views
0

我有一個shell腳本,對於自動執行我的ssh連接和我想通過ssh執行的任何其他操作都非常有效。然而,當主機無法找到或連接被拒時,我對結果非常不滿意。如果主機無法找到,超時發送打印我的密碼到屏幕上...沒有好處。我通過添加無限超時<設置超時-1>來解決這個問題。當連接被拒絕時;但是,我收到有關連接如何被拒絕以及發送錯誤等信息,並且我的密碼也被打印出來。有沒有辦法告訴我的腳本,如果確切的期望不滿足,那麼不​​要繼續發送,只需按Ctrl + C?以下是我的shell腳本的相關部分:(順便說一句,在bash中使用)提前致謝。如何使用期望的ssh登錄自動化來解決連接失敗問題?

expect -c " 
    spawn ssh [email protected]$HOST 
    expect -exact \"[email protected]$HOST's password:\" 
    send \"$PASS\r\" 
    interact" 

回答

1

答案是期望timeout關鍵字。如果沒有任何模式匹配,則發生timeout條件 - 當然,您不能將超時值設置爲-1:將其設置爲合理的秒數。

相反惡補大十歲上下的腳本到-c說法,把它放到一個文件

#! /usr/local/bin/expect -f 
set host [lindex $argv 0] 
set user [lindex $argv 1] 
set password [lindex $argv 2] 
# or, foreach {host user password} $argv {break} 

spawn ssh [email protected]$host 
expect { 
    -re {password: $} {send "$password\r"} 
    timeout {error "ssh connection timed out!"} 
} 
interact