2012-03-14 29 views
3

ときどきリモートSSHサーバーに接続すると、私はConnection Closed By *IP*; Couldn't read packet: Connection reset by peer.を取得することがありますが、1回または2回以上試してから正しく接続します。SSHに接続するまでのループ

これは、アーカイブされたバックアップをSSHサーバーに自動的にアップロードするために使用するいくつかのbashスクリプトに問題があります。

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

+0

私が行っても、接続されているかどうかを確認する方法が欲しいと思います。もしそうでなければループしてください...サーバがリブートしているか、バックアップスクリプトの時刻cronから実行しています。 – natli

答えて

-1

私は、シェルスクリプトの専門家ではないけど、それが終了したとき、私はsshpassの戻り値をチェックします。 man sshから

man sshpathから

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

戻る他のプログラムと同じように

値、sshpass成功すると0を返します。 障害が発生した場合には、以下の戻りコードが使用されます。

  1. 無効なコマンドライン引数
  2. 矛盾する引数
  3. 一般的なランタイムエラーのsshから
  4. 認識できない応答(パースエラー)
  5. 無効与えられました/不正なパスワード
  6. ホストの公開鍵は不明です。 sshpassは、新しい鍵を確認せずに終了します。

さらに、の攻撃中にsshが人に迷惑をかけている可能性があります。この苦情はttyには行きません。つまり、でもsshpassを指定すると、sshからのエラーメッセージが標準エラーに出力されます。 このような場合、sshのリターンコードが返されます。これは通常、すべてのエラーの場合には想像力に欠けた(そして参考にならない) "255"の です。

したがって、コマンドを実行して戻り値を確認してください。戻り値が0SUCCESSの場合)でない場合は、もう一度やり直してください。成功するまで、whileループを使用して繰り返します。

追記:なぜあなたはsshpassを使用して代わりにpublic-key (passwordless) authentication?されていることがより安全です(パスワードを書き留めする必要がありません)と、通常のsshssh [email protected]のと同じくらい簡単経由でログインします。

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

+0

うまく働いて、キーファイルのヒントをありがとう;) – natli

+0

+1キーの提案のための+1。 – glglgl

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

+1

ナチュリはforループを尋ねるので、それはすべてです –

関連する問題