必须在服务端配置ClientAliveInterval 300与ClientAliveCountMax 3并重启sshd,二者缺一不可,总超时15分钟,配合TCPKeepAlive yes形成双保活,才能真正强制清理空闲SSH连接。

要让 Linux 的 SSH 服务限制空闲会话并自动退出,关键不是“等它断”,而是主动探测 + 强制清理。必须在服务端配置心跳机制,仅靠客户端或 shell 层设置无法真正保障远程连接的安全退出。
服务端强制空闲断连(核心配置)
这是唯一对所有 SSH 用户生效、不依赖用户权限、能应对网络假活跃的方案。编辑 /etc/ssh/sshd_config:
-
取消注释或添加这两行(缺一不可):
-
ClientAliveInterval 300
表示 sshd 每 5 分钟向客户端发一次加密心跳包 -
ClientAliveCountMax 3
表示连续 3 次未收到响应就关闭连接 → 总空闲容忍时间为 15 分钟
-
切勿设
ClientAliveCountMax 0:这会导致首次心跳失败就立刻断开,极易被网络抖动误杀修改后必须执行:
sudo systemctl restart sshd
(仅 reload 不保证生效)
搭配 TCP 底层保活(增强稳定性)
为防中间设备(如家用光猫、企业防火墙)提前清理连接,建议同时启用:
-
TCPKeepAlive yes
让内核 TCP 协议栈也参与保活,与 SSH 层心跳形成双保险 - 该选项默认通常是
yes,但显式写出更稳妥
避免常见陷阱
- TMOUT(shell 层超时)和 ClientAlive 是两套机制:TMOUT 只管终端无输入,不管网络是否断;ClientAlive 才真正管连接存活性
- 不要只配 ClientAliveInterval 却漏掉 ClientAliveCountMax —— 单独设置前者无效
- 云服务器(如阿里云、腾讯云)部分镜像会覆盖默认配置,改完务必用
sudo sshd -T | grep clientalive验证是否加载成功
验证是否生效
- 登录后保持终端静默,等待设定时间(如 15 分钟),观察是否自动断开
- 或手动检查:
sudo ss -tnp | grep :22看连接状态,配合journalctl -u sshd -n 20查日志中是否有Connection closed due to timeout类提示


















