You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSH连接因输入密码超时断开,如何实现自动重试?

解决SSH等待输入密码超时断开后自动重试的问题

1. 延长服务器登录宽限时间(优先方案)

问题根源是服务器端sshd的LoginGraceTime参数,它控制从建立连接到完成登录的最大等待时长(默认通常为60秒)。如果有权限修改服务器配置:

  • 编辑/etc/ssh/sshd_config,找到或添加:
    LoginGraceTime 300
    
    这里设为300秒(5分钟),可根据需求调整时长。
  • 重启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 09:27:06