循环直到连接到SSH

时间:2012-03-14 11:07:29

标签: linux bash ssh

有时连接到远程SSH服务器时,我得到Connection Closed By *IP*; Couldn't read packet: Connection reset by peer.但是在尝试了一两次之后它才正确连接。

这会出现一些问题,我使用一些bash脚本自动将存档的备份上传到SSH服务器,就像这样;

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

如果它实际正确连接,我怎么能有这个部分循环?

更新:(解决方案)

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

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

export SSHPASS=$sshpassword

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

until sshpassFunc; do
    sleep 1
done

(未经测试)

答案 1 :(得分:-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.   
  5. 常规运行时错误
  6.   
  7. 来自ssh的无法识别的响应(解析错误)
  8.   
  9. 密码无效/错误
  10.   
  11. 主机公钥未知。 sshpass退出而不确认新密钥。
  12.         

    另外,ssh可能会抱怨中间的男人   攻击。这个投诉没有进入tty。换句话说,甚至   使用sshpass,ssh的错误消息将打印为标准错误。   在这种情况下,报告ssh的返回码。这通常是   所有错误案例都是缺乏想象力的(并且没有信息)“255”。

因此,请尝试运行该命令,并检查其返回值。如果返回值不是0(对于SUCCESS),请再试一次。重复使用while循环,直到成功。

旁注:您为什么使用sshpass代替public-key (passwordless) authentication?它更安全(您无需记下密码)并通过常规ssh轻松登录为ssh username@host

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