SSH连接因输入密码超时断开,如何实现自动重试?
解决SSH等待输入密码超时断开后自动重试的问题
1. 延长服务器登录宽限时间(优先方案)
问题根源是服务器端sshd的LoginGraceTime参数,它控制从建立连接到完成登录的最大等待时长(默认通常为60秒)。如果有权限修改服务器配置:
- 编辑
/etc/ssh/sshd_config,找到或添加:
这里设为300秒(5分钟),可根据需求调整时长。LoginGraceTime 300 - 重启sshd服务生效:
sudo systemctl restart sshd
2. Shell脚本实现自动重试(无密码自动输入)
如果无法修改服务器配置,可通过shell脚本捕获连接断开错误并自动重试:
#!/bin/bash # 替换为你的服务器用户名和地址 USER="your_user" HOST="your_server_ip_or_domain" while true; do ssh "$USER@$HOST" # SSH连接成功退出码为0,断开/失败通常为255 if [ $? -eq 0 ]; then break fi echo "连接已断开,10秒后重试..." sleep 10 done
将脚本保存为ssh-retry.sh,添加执行权限后运行:
chmod +x ssh-retry.sh ./ssh-retry.sh
3. Expect脚本实现带密码自动重试(需谨慎使用)
如果需要自动输入密码并重试,可使用expect工具(先通过包管理器安装,如apt install expect或brew install expect):
#!/usr/bin/expect set user "your_user" set host "your_server_ip_or_domain" set pass "your_password" set retry_wait 10 while {1} { spawn ssh "$user@$host" expect { "password:" { send "$pass\r" interact exit 0 } "Connection closed by" { puts "连接断开,$retry_wait秒后重试..." sleep $retry_wait } timeout { puts "连接超时,$retry_wait秒后重试..." sleep $retry_wait } } }
保存为ssh-auto-retry.exp,添加执行权限后运行。注意:明文存储密码存在安全风险,仅在测试环境使用,生产环境优先用密钥登录。
4. SSH密钥登录(彻底规避问题)
配置SSH密钥登录后无需输入密码,从根源解决等待超时问题:
- 生成密钥对(一路回车采用默认配置即可):
ssh-keygen -t ed25519 - 将公钥上传至服务器:
ssh-copy-id $USER@$HOST
之后再执行ssh $USER@$HOST即可直接登录,无密码输入环节。
内容的提问来源于stack exchange,提问作者Mikhail Chereshenkov
相关产品推荐
相关产品推荐

