tmout变量控制shell层空闲登出,需export导出并写入正确profile文件(如/etc/profile或~/.bash_profile),设为正整数秒(如900),配合ssh的clientaliveinterval与clientalivecountmax协同生效。

TMOUT 变量控制 Shell 层空闲登出
只要用户用的是 Bash 或 Zsh(绝大多数情况),TMOU 是最直接、生效最快的方式。它不依赖网络或服务端探测,而是由 shell 自身在读取输入时计时:连续无键盘输入达到设定秒数,就自动执行 exit。
常见错误现象:改了 /etc/profile 但新终端没反应;或者只写了 TMOUT=900 没加 export,导致变量未导出到子 shell。
- 全局生效:编辑
/etc/profile,末尾添加export TMOUT=900(15 分钟),然后运行source /etc/profile - 单用户生效:在
~/.bashrc或~/.bash_profile里加同样一行,再执行source ~/.bashrc - 临时禁用当前会话:运行
unset TMOUT即可,无需重启终端 - 注意:图形终端(如 GNOME Terminal)通常忽略
TMOUT;vim、less、top等全屏程序运行期间,计时会暂停
sshd_config 中 ClientAliveInterval 控制 SSH 连接层断连
仅靠 TMOUT 不足以覆盖所有 SSH 场景——比如网络卡顿、客户端崩溃、后台进程阻塞了 shell 输入,此时连接还挂着,但用户已失去控制。这时必须靠 SSH 服务端主动探测。
常见错误现象:设置了 ClientAliveInterval 却没设 ClientAliveCountMax,结果连接从不断开;或改完配置忘了 systemctl restart sshd,导致配置完全不生效。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 编辑
/etc/ssh/sshd_config,确保两行同时存在且未注释:ClientAliveInterval 300和ClientAliveCountMax 2 - 含义:服务器每 5 分钟发一次保活包,连续 2 次无响应(即空闲满 10 分钟)就强制关闭 TCP 连接
-
ClientAliveCountMax 0表示“只要一次没回就断”,慎用,可能误杀弱网环境 - 改完必须执行
sudo systemctl restart sshd,reload不可靠,部分旧版 OpenSSH 不支持热重载该参数
TMOUT 和 ClientAlive 同时启用时谁起作用?
两者不冲突,但有优先级:一旦 TMOUT 非零,shell 会在超时后先退出,此时 SSH 连接还没断,但用户 session 已终结;而 ClientAlive 是在网络层兜底——即使 shell 没退出(比如被 sleep 卡住),连接也会在约定时间后被服务端硬断。
容易踩的坑:有人把 TMOUT 设成 30 秒,又把 ClientAliveInterval 设成 60 秒,结果发现“有时 30 秒就退,有时要等 60 秒”,其实是 shell 退出和连接断开两个动作先后发生的自然表现,不是 bug。
- 推荐组合:Shell 层
TMOUT=900(15 分钟),SSH 层ClientAliveInterval 600+ClientAliveCountMax 2(20 分钟),让 shell 先退,连接稍晚一点收尾 - 如果系统启用了
systemd-logind并配置了IdleAction=lock,它只影响本地 TTY,对 SSH 无效,不必担心干扰 - root 用户也受
TMOUT影响,但若通过sudo -i进入 root shell,需确保其配置文件里没unset TMOUT
为什么改了配置还是不超时?重点查这三处
多数失效不是配置写错,而是环境或权限链路中断。别急着重配,先快速验证这几个点。
- 确认当前 shell 类型:
echo $SHELL—— 如果是/bin/sh或/bin/dash,TMOUT不生效(它们不支持该变量) - 检查是否被覆盖:
declare -p TMOUT查看输出,若显示not found或值为空,说明没加载成功;若显示readonly但值不对,说明有其他脚本重设并锁定了它 - 验证 SSH 配置是否真被加载:
sudo sshd -T | grep -E "(clientalive|logingracetime)",这条命令会输出运行中 sshd 实际使用的参数,比翻配置文件更可信
真正复杂的地方在于:你永远不知道用户正在跑什么程序、用什么终端、是否套了 tmux/screen、有没有被 PAM 模块拦截或重定向了输入流。所以别追求“一劳永逸”,先让 TMOUT 和 ClientAlive 在干净终端下稳定工作,再逐步覆盖边缘场景。










