有时连接到远程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
答案 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。的情况下 失败,使用以下返回码:
- 无效的命令行参数
- 给出的冲突论点
- 常规运行时错误
- 来自ssh的无法识别的响应(解析错误)
- 密码无效/错误
- 主机公钥未知。 sshpass退出而不确认新密钥。
醇>另外,ssh可能会抱怨中间的男人 攻击。这个投诉没有进入tty。换句话说,甚至 使用sshpass,ssh的错误消息将打印为标准错误。 在这种情况下,报告ssh的返回码。这通常是 所有错误案例都是缺乏想象力的(并且没有信息)“255”。
因此,请尝试运行该命令,并检查其返回值。如果返回值不是0
(对于SUCCESS
),请再试一次。重复使用while
循环,直到成功。
旁注:您为什么使用sshpass
代替public-key (passwordless) authentication?它更安全(您无需记下密码)并通过常规ssh
轻松登录为ssh username@host
。