2013-04-03 175 views
9

我有一個這樣的程序:如何使SSH命令執行超時

ssh -q [email protected] exit 
echo "output value -->$?" 

在上面的代碼,我想SSH到遠程服務器,並嘗試檢查,如果我可以連接或不。 我有幾個服務器,這是密碼少激活和少數服務器的密碼仍未停用。 所以我擔心,如果有密碼,它會卡住在同一個屏幕上詢問密碼,並且它會在無限期的時間內出現,無需退出邏輯。

問題:如何爲上述代碼實現定時器,以及它是否保持在同一屏幕上詢問密碼。並與一些錯誤代碼

2)當我執行上面的代碼中,我得到以下錯誤代碼退出:

127 -- > I guess its for success 
225 -- > for any error. 

是否有任何其他錯誤代碼除上述以外的?

+0

http://www.eldos.com/documentation/sbb/documentation/ref_err_ssherrorcodes.html,找到一個鏈接, – gmhk

+0

如果沒有提供密碼並且沒有設置基於密鑰的身份驗證,請勿發生爆炸。 使用預期腳本。 (在google/stackoverflow上搜索ssh + expect,查看模板腳本) – anishsane

+4

使用-o PasswordAuthentication = no – Vorsprung

回答

14

您可以使用timeout命令將呼叫打包爲ssh。如果發生超時,則timeout命令以代碼124退出。

timeout 10s ssh -q [email protected] exit 
if [ $? -eq 124 ]; then 
    echo "Timeout out" 
fi 

或者,如Vorsprung曾這樣評價您的問題(因爲我是仰視的男人頁!):

ssh -oPasswordAuthentication=no -q [email protected] exit 

將不允許交互式密碼驗證。然後您必須檢查退出代碼。

+0

ssh -oPasswordAuthentication = no -q [email protected]。238退出 - >此工作 – gmhk

+0

@gmhk - 不要忘了點擊對號最有幫助的答案。 – ghoti

2

聽起來好像問題是一次詢問對多個主機的「批處理模式」處理(例如,在一個循環中)。如果PKA爲而非配置爲給定主機(公鑰認證 - 「無密碼」登錄提到原始問題),則以下ssh命令將簡單失敗,因此它對於您只想繼續運行的腳本無論連接到一臺或兩臺主機的問題如何。它也不會打擾所有關於「您確定要繼續連接」到以前未知的主機的所有疑問(或者您可以將StrictHostKeyChecking no添加到您的~/.ssh/config中)。例如,

for host in host1 host2 host3 # etc 
do 
    ssh -o BatchMode=yes -o StrictHostKeyChecking=no -o ConnectTimeout=5 \ 
     [email protected]$host 'uptime' || echo "problem: host=$host" 
done 

你必須檢查你的(客戶端)ssh手冊頁,看看這些選項(BatchModeConnectTimeout)的支持,雖然。