直接运行echo $TMOUT即可查看当前shell会话的TMOUT值:输出为空或0表示未启用,输出数字(如600)表示已设置对应秒数超时;该值仅反映当前会话实际生效值,受export和readonly约束,且不体现SSH网络层保活状态。

怎么查看当前 shell 会话的 TMOUT 值
直接运行 echo $TMOUT 就能知道当前终端是否启用了空闲超时,以及具体秒数。如果输出为空或 0,说明未启用或被显式清空;输出数字(如 600)表示已设置为对应秒数。
注意:TMOUT 是 shell 级变量,只对当前会话及其子 shell 生效。它不会影响 SSH 连接本身的网络层保活,也不会作用于 tmux、screen 或图形终端内的 shell。
- 若用户执行过
unset TMOUT或在~/.bashrc中覆盖了该值,echo $TMOUT显示的是最终生效值,不是配置文件里的原始值 - 某些发行版(如 RHEL/CentOS)默认不设
TMOUT,所以多数情况下输出为空 readonly TMOUT之后无法用unset或重新赋值绕过,此时echo $TMOUT仍有效,但修改会失败
怎么确认 SSH 服务端是否配置了空闲断连
SSH 层面的超时由 sshd_config 控制,和 shell 的 TMOUT 完全无关。要查实际生效的配置,不能只看文件里有没有注释行,得确认加载的是哪份配置、是否重启过服务。
执行 sudo sshd -T | grep -E "^(clientaliveinterval|clientalivecountmax)$" 后,就能直接看到当前 sshd 实际生效的参数值。要是没有任何输出,就表示这两个参数都还在走默认配置,其中 ClientAliveInterval 默认是 0,也就是心跳机制没有启用。
ClientAliveInterval 0表示服务器不主动发心跳,连接可能一直挂着,哪怕客户端已断网ClientAliveCountMax只有在ClientAliveInterval> 0 时才起作用,两者必须配合使用- 修改
/etc/ssh/sshd_config后,必须执行sudo systemctl restart sshd才会生效,reload 不一定重载这些参数
怎么判断一个登录会话是否“已超时但还没断开”
系统不会实时广播“这个会话已超时”,而是靠检测空闲时间触发退出动作。所以真正的问题是:当前这个终端到底算不算“正在倒计时”?
最可靠的判断方式是结合 w 和 ps:
- 运行
w,看对应用户的IDLE列 —— 这是该 tty 上最后一个键盘/鼠标输入距今的分钟数(不是秒),单位粗略,但足够判断是否接近TMOUT设置 - 运行
ps -o pid,tty,time,cmd -u $(whoami),找你的 shell 进程(如/bin/bash),看TIME列是否远大于IDLE—— 如果是,说明 shell 一直在后台运行,但你没交互,正处在TMOUT计时中 last -n 5只能告诉你过去登出时间,不能反映当前会话是否将被自动注销
为什么 timeout 命令查不到会话超时设置
timeout 是用来限制单个命令执行时长的工具,和会话空闲超时完全无关。它既不读取也不影响 TMOUT 或 SSH 配置。
误用 timeout 10s bash 只会让这个新启动的 bash 子进程最多活 10 秒,跟当前登录会话毫无关系。这种混淆常出现在搜索“linux timeout command”时被误导。
timeout的典型用途是防止脚本卡死,比如timeout 30s curl http://example.com- 它对
sshd、login、getty等守护进程无任何控制力 - 试图用
timeout包裹整个 shell 会话(如timeout 600 bash)会导致每次命令都要重新启动 shell,完全不可用
TMOUT,二是远程 sshd 是否启用了 ClientAliveInterval + ClientAliveCountMax。其他命令或参数都是干扰项。