SSH连接频繁断开主因是心跳配置不当或空闲超时,应优先配置服务端ClientAliveInterval 60与ClientAliveCountMax 3,辅以客户端ServerAlive参数及禁用TMOUT或使用tmux/screen。

SSH连接频繁断开,多数情况不是网络本身不稳定,而是心跳检测没配好,或者空闲超时机制在起作用。解决思路很明确:一要让连接“有呼吸”,二要让会话“不打盹”。下面分三块说清楚。
服务端心跳配置(推荐优先做)
这是最根本的设置,改一次,所有客户端都受益。编辑服务器上的 /etc/ssh/sshd_config 文件,确保以下三项启用且合理:
- TCPKeepAlive yes:开启底层TCP保活探测,由操作系统内核定期发包
- ClientAliveInterval 60:服务器每60秒向客户端发一次存活探测(30–120秒之间较稳妥)
- ClientAliveCountMax 3:连续3次没收到回应才断开,即最多容忍约3分钟无响应
保存后执行 sudo systemctl restart sshd 或 sudo service sshd reload 生效。注意:如果 ClientAliveInterval 被误设为10、ClientAliveCountMax=1,就会出现“10秒必断”的现象,务必检查。
客户端心跳配置(本地机器设置)
适合你没有服务器权限,或想为特定主机单独优化的情况。编辑本地 ~/.ssh/config(Linux/macOS)或 C:\Users\用户名\.ssh\config(Windows),添加:
- 对某台主机:Host myserver 下写 ServerAliveInterval 60 和 ServerAliveCountMax 3
- 对所有主机:Host * 下统一配置,全局生效
- 临时连接可用命令行参数:ssh -o "ServerAliveInterval=60" -o "ServerAliveCountMax=3" user@host
部分终端如 MobaXterm、FinalShell、iTerm2 自带 KeepAlive 开关,直接在连接设置里勾选即可,无需改配置文件。
防空闲会话终止(Shell 层面补漏)
即使网络连接一直在线,Shell 本身也可能因空闲被杀。这和 SSH 心跳无关,而是 Linux 的 TMOUT 环境变量在起作用:
- 检查是否设置了:echo $TMOUT,若输出数字(如 600),说明 10 分钟无操作就退出
- 临时禁用:unset TMOUT
- 永久禁用(仅限可信环境):在 ~/.bashrc 或 /etc/profile 中加 TMOUT=0
更稳妥的做法是搭配 tmux 或 screen 使用——它们能保持会话状态,哪怕 SSH 断了重连也能恢复,对长任务、日志跟踪特别实用。










