2012-03-14 84 views
3

有時當連接到遠程SSH服務器時,我得到Connection Closed By *IP*; Couldn't read packet: Connection reset by peer.但嘗試一次或兩次後,它連接正常。循環直到連接到SSH

這提出了幾個bash腳本的問題,我用這些腳本自動將歸檔的備份上傳到SSH服務器,就像這樣;

export SSHPASS=$sshpassword 
sshpass -e sftp -oBatchMode=no -b - [email protected]$sshaddress << ! 
    cd $remotefolder 
    put $backupfolder/Qt_$date.sql.gz 
    bye 
! 

如何才能使這部分循環,直到它實際上正確連接?

UPDATE(解決方案)

RETVAL=1 
while [ $RETVAL -ne 0 ] 
do 
export SSHPASS=$sshpassword 
sshpass -e sftp -oBatchMode=no -b - [email protected]$sshaddress << ! 
    cd $remotefolder 
    put $backupfolder/Qt_$date.tgz 
    bye 
! 
RETVAL=$? 
[ $RETVAL -eq 0 ] && echo Success 
[ $RETVAL -ne 0 ] && echo Failure 
done 
+1

解決實際問題, 「coudln't讀取數據包:由對等連接復位」。 – rapadura 2012-03-14 11:12:57

+0

即使我這樣做,我仍然想要一種方法來驗證它是否連接,如果不是,則會循環...對於我所知的服務器在重新啓動或在備份腳本出現網絡問題時從cron運行。 – natli 2012-03-14 11:14:47

回答

-1

我不是一個shell腳本專家,但退出時我會檢查的sshpass返回值。

man ssh

ssh exits with the exit status of the remote command or 
with 255 if an error occurred. 

man sshpath

返回值

與任何其他程序,sshpass成功返回0。在 故障的情況下,下面的返回代碼被使用:

  1. 無效的命令行參數
  2. 衝突參數給出
  3. 一般的運行時錯誤
  4. 從SSH無法識別的響應(分析錯誤)
  5. 無效/不正確的密碼
  6. 主機公鑰是未知的。 sshpass在沒有確認新密鑰的情況下退出。

另外,ssh可能會在中間 的攻擊中抱怨男人。這個投訴不會去tty。換句話說,即使使用sshpass的 ,來自ssh的錯誤消息也會打印到標準錯誤。 在這種情況下,ssh的返回碼會被回報。對於所有的錯誤情況,這通常是一個難以想象(並且不具信息性)的「255」。

因此,嘗試運行該命令,並檢查其返回值。如果返回值不是0(對於SUCCESS),請再試一次。重複使用while循環,直到成功。

旁註:你爲什麼要使用sshpass代替public-key (passwordless) authentication?它是更安全的(你不必寫下您的密碼),並使其可以通過定期ssh一樣容易ssh [email protected]登錄。

even an easy tool to set it up: ssh-copy-id.

+0

工作得很好,並感謝您的密鑰文件提示;) – natli 2012-03-14 11:28:56

+0

+1關鍵驗證建議。 – glglgl 2012-03-14 13:35:26

0

嘗試是這樣的:

export SSHPASS=$sshpassword 

sshpassFunc() { 
    sshpass -e sftp -oBatchMode=no -b - [email protected]$sshaddress << ! 
    cd $remotefolder 
    put $backupfolder/Qt_$date.sql.gz 
    bye 
! 
} 

until sshpassFunc; do 
    sleep 1 
done 

(未測試)

+2

現在由此產生的每個進程都清楚地知道您的密碼,因爲您通過環境變量將其導出。請爲這些情況使用無密碼的公鑰交換。 – Marcin 2012-03-14 13:20:58

+1

我已經證明,因爲natli問一個循環,就是這樣... – 2012-03-14 15:50:56