serveraliveinterval 和 serveralivecountmax 必须同时配置才有效,前者控制心跳发送间隔(如60秒),后者决定连续失败次数(如5次)后断连;单独设置前者无效,且需写入 ~/.ssh/config 并设权限600。

ServerAliveInterval 和 ServerAliveCountMax 必须一起配
单独设 ServerAliveInterval 不起作用。它只控制“多久发一次心跳”,但不决定“发几次没回就断”。必须同时指定 ServerAliveCountMax,否则 SSH 会忽略心跳逻辑。
-
ServerAliveInterval 60:客户端每 60 秒向服务端发一个加密心跳包 -
ServerAliveCountMax 5:连续 5 次没收到响应才断开,即最多容忍 300 秒无交互 - 设成
ServerAliveCountMax 0是禁用机制,不是“永不超时” - 常见错误是只写
ServerAliveInterval,结果配置看似生效,实则完全无效
配在 ~/.ssh/config 里,权限必须是 600
用户级配置应写入 ~/.ssh/config,不能改系统级的 /etc/ssh/ssh_config——后者影响所有用户,且容易被后续更新覆盖。
- 按 Host 精确匹配更安全,例如:
Host prod-server后跟具体参数,避免误配到其他主机 - 文件权限必须是
600:chmod 600 ~/.ssh/config,否则 SSH 直接跳过读取 - 别用
Host *全局匹配,尤其当连接不同网络环境(如内网/云服务器)时,心跳间隔需求可能不同
命令行临时覆盖最可靠,适合调试
当你不确定配置是否生效,或没有权限改 config 文件时,直接用 -o 参数最直观、优先级最高。
- 命令示例:
ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=5 user@host - 加
-vvv可验证:等满 60 秒后看到debug3: send packet: type 80就说明心跳已发出 - 该方式会绕过
~/.ssh/config和/etc/ssh/ssh_config中的同名设置,适合快速验证问题是否出在保活配置上
别漏掉 TMOUT 和终端软件自己的 Keepalive
即使 SSH 保活全开,还是掉线?大概率是其他层在干预。
- 运行
echo $TMOUT,如果输出数字(比如600),说明 Shell 自己会在 10 分钟后退出,和 SSH 无关;临时解决:unset TMOUT - iTerm2、MobaXterm、SecureCRT 都有独立的 “SSH Keepalive” 开关,必须手动打开,且建议设成和
ServerAliveInterval一致 -
TCPKeepAlive yes是可选补充,它触发底层 TCP 探测包,但不能替代应用层心跳;某些 NAT 设备对 TCP 包不敏感,光靠它不够











