必须同时配置tmout和clientaliveinterval+clientalivecountmax:tmout=1800管控键盘空闲,clientaliveinterval 600与clientalivecountmax 3协同实现30分钟网络心跳探测,二者分别解决“人没操作”和“网断进程挂”问题,缺一不可。

要让 Linux 系统中 SSH 服务在用户空闲时自动断开连接,关键不是“只改一个地方”,而是同时配置两套机制:一套管“人没敲键盘”,一套管“网断了但连接还挂着”。缺一不可,否则会出现“设了却没断”或“断得莫名其妙”的情况。
一、控制登录后无操作的 Shell 级超时(TMOUT)
这是最直观的“空闲退出”:只要终端没输入,倒计时结束就自动登出。它对所有 Bash 登录会话生效(包括 SSH 和本地 tty)。
- 编辑全局配置:
sudo nano /etc/profile - 在文件末尾添加两行:
TMOUT=1800
export TMOUT - 保存后,新登录的会话即生效(已有会话需重新登录或执行 source /etc/profile)
- 验证:登录后运行 echo $TMOUT,应输出 1800(即 30 分钟)
⚠️ 注意:TMOUT 只监控键盘输入。运行 vim、tail -f、笔记本合盖休眠时,计时会暂停;GNOME Terminal/Konsole 默认不加载 /etc/profile,此设置可能无效。
二、控制网络层真实连接状态(ClientAliveInterval + ClientAliveCountMax)
这是解决“假活跃”的核心:即使客户端崩溃、断网、休眠,sshd 仍能通过加密心跳探测并清理僵尸连接。
- 编辑服务端配置:
sudo nano /etc/ssh/sshd_config - 确保以下两行已取消注释,且格式正确(不能带等号,不能有 #):
ClientAliveInterval 600
ClientAliveCountMax 3
→ 含义:每 10 分钟发一次心跳,连续 3 次无响应(即最多容忍 30 分钟无网络反馈)后强制断连 - 保存后必须重启服务:
sudo systemctl restart sshd
(仅 reload 可能不生效,尤其涉及心跳参数时)
三、为什么必须两者都配?
- 只设 TMOUT:客户端休眠或网络中断后,sshd 还维持 ESTABLISHED 连接,资源不释放,防火墙/NAT 易老化断连,且别人可能复用残留会话。
- 只设 ClientAlive:用户静静看着屏幕(比如读日志),没输命令也没断连,不符合“安全空闲退出”的管理要求。
- 两者叠加,才能覆盖“人不动”和“网不通”两种典型空闲场景。
四、验证是否真起作用
别只看配置文件或变量值——要做实际测试:
- Shell 层验证:新 SSH 登录后,先运行 unset TMOUT,然后静默等待 30 分钟,观察是否被踢出(若没退出,说明 ClientAlive 未生效)
- 网络层验证:另一台机器登录后,用 sudo ss -tnp | grep :22 确认连接存在;拔掉客户端网线或关机,等满 30 分钟再查,连接应已消失
注意干扰项:systemd-logind 的 IdleAction=terminate 可能提前干掉会话,可运行 loginctl show-user $USER 查看 IdleHint 和 IdleSinceUSec 状态。











