tmout环境变量优先级最高,非零时会直接覆盖ssh保活配置;必须设为0或unset才能使clientaliveinterval与serveraliveinterval生效,二者需配合countmax参数且同时启用。

SSH自动断开连接时间由三类机制共同决定:服务端保活探测、客户端保活响应、以及 shell 层级的 TMOUT 环境变量。其中 TMOUT 优先级最高,一旦非零,会直接覆盖 SSH 层的保活配置——这是最常被忽略、也最容易导致配置“失效”的原因。
为什么改了 sshd_config 还是断连?
根本原因是 TMOUT 环境变量已生效。只要 TMOUT 被设为非零值(比如 export TMOUT=600),无论 ClientAliveInterval 和 ClientAliveCountMax 怎么调,SSH 连接都会在 TMOUT 秒无操作后被 shell 主动退出。
-
TMOUT是 bash/zsh 的内置变量,作用于登录后的 shell 会话本身,不是 SSH 协议层行为 - 它通常被写在
/etc/profile、/etc/bashrc或用户家目录下的~/.bashrc里 - 检查是否启用:
echo $TMOUT;若输出数字(如600),说明它正在起效 - 临时禁用:
unset TMOUT;永久禁用需删掉对应配置行并重载 shell
ClientAliveInterval 和 ClientAliveCountMax 怎么配才有效
这两个参数必须同时设置且都非注释状态,否则服务端不会发送保活包。它们定义的是「服务器主动探测客户端是否存活」的行为,只在 TMOUT=0 或未设置时起作用。
-
ClientAliveInterval 60:服务器每 60 秒发一次空包给客户端,等待响应 -
ClientAliveCountMax 3:连续 3 次没收到响应(即 3×60 = 180 秒空闲)后,强制关闭连接 - 修改后必须重启服务:
sudo systemctl restart sshd(Ubuntu/Debian/CentOS 7+) - 不建议设成
ClientAliveInterval 0:这表示禁用探测,等同于不保活
客户端要不要配 ServerAliveInterval
要,但仅限你无法控制服务端配置时(比如连的是云厂商默认实例、学校服务器)。它让本地 SSH 客户端主动发心跳,绕过服务端限制。
- 写入
~/.ssh/config,注意权限必须是600:chmod 600 ~/.ssh/config - 示例配置:
Host * ServerAliveInterval 60 ServerAliveCountMax 3 - 该配置对所有主机生效;如只想针对某台,把
*换成具体 HostName 或别名 - 命令行临时覆盖:
ssh -o ServerAliveInterval=30 user@host
TMOUT 和 SSH 保活机制的冲突点
这是最易踩的坑:很多人一边在 /etc/profile 里写了 export TMOUT=300,一边又去调 sshd_config,结果发现怎么改都不管用。
-
TMOUT=300→ 5 分钟无操作,shell 自己 exit,SSH 连接自然断开,此时ClientAliveInterval根本没机会触发 - 若你真需要「5 分钟断连」,直接用
TMOUT就够了,不用动 SSH 配置 - 若你希望「长时间保持连接」(比如跑长任务),必须确保
TMOUT未设置或设为0,再配服务端保活 - 安全团队有时会全局注入
TMOUT,这种情况下你只能从客户端侧用ServerAliveInterval维持 TCP 连接,但 shell 层仍会在TMOUT后退出











