clientaliveinterval与clientalivecountmax协同实现服务端主动断连:前者设心跳间隔(秒),后者设最大失联次数,超时时间≈二者乘积;需在/etc/ssh/sshd_config中配置并执行sudo systemctl reload sshd生效。

Linux中通过 sshd_config 的 ClientAliveInterval 和 ClientAliveCountMax 可以有效防止 SSH 会话长时间空闲不退出,从而避免“僵尸会话”堆积(即已断开网络但服务端仍维持连接的状态)。这不是真正意义上的“清理进程”,而是让 OpenSSH 主动探测并关闭无响应的连接。
ClientAliveInterval 与 ClientAliveCountMax 的作用机制
这两个参数协同工作,实现超时控制:
-
ClientAliveInterval:单位为秒,表示 SSH 服务端每隔多久向客户端发送一次“心跳包”(即
SSH_MSG_GLOBAL_REQUEST类型的 keepalive 消息); - ClientAliveCountMax:表示允许连续多少次心跳未收到响应后,服务端主动断开该连接。
实际超时时间 ≈ ClientAliveInterval × ClientAliveCountMax。例如设为 60 和 3,则约 3 分钟无响应后连接被关闭。
如何配置生效(服务端视角)
编辑 SSH 服务端配置文件:
# 编辑配置
sudo nano /etc/ssh/sshd_config
# 添加或修改以下两行(取消注释并调整数值)
ClientAliveInterval 60
ClientAliveCountMax 3
# 保存后重载 SSH 服务(不中断现有连接)
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
sudo systemctl reload sshd
注意:reload 足够使新连接应用配置;已有连接仍沿用旧设置,直到下次新建会话才会受控。
配合 TCPKeepAlive 和其他参数更稳妥
单独依赖 ClientAlive 不够全面,建议搭配以下设置:
- TCPKeepAlive yes:启用底层 TCP keepalive(系统级),可捕获网络层断连(如客户端直接关机),但无法识别 NAT 超时或防火墙静默丢包;
- ClientAliveInterval + ClientAliveCountMax:应用层心跳,更可靠,能应对大多数 NAT/防火墙场景;
- 避免设
ClientAliveCountMax 0:这会导致心跳失效(OpenSSH 文档明确说明 0 表示禁用探测); - 不要依赖
TMOUT或 shell 超时:那是客户端 shell 层行为,对已断开但服务端未察觉的会话无效。
验证是否生效及排查常见问题
检查当前活跃 SSH 连接及其空闲时间:
# 查看所有 sshd 进程及关联终端
ps -eo pid,tty,cmd,etime | grep sshd | grep -v grep
# etime 是进程启动至今的秒数,结合 netstat 可辅助判断是否僵死
sudo ss -tnp | grep :22
若发现大量连接长时间存在且无交互,可能原因包括:
- 客户端设置了
ServerAliveInterval(客户端主动发心跳),干扰了服务端探测逻辑(一般不冲突,但极端情况可能掩盖超时); - 防火墙/NAT 设备清除了连接跟踪表,但未通知两端,导致服务端一直等响应;此时需缩短探测周期(如
Interval 30, CountMax 2); - 配置未重载或写错位置(确保在全局 section,不在 Match 块内被覆盖)。










