最可靠方式是直接修改 /etc/profile 并分两行写 TMOUT=600 和 export TMOUT,合并写或放 ~/.bashrc 会导致不生效;验证需确认 echo $TMOUT 和 sh -c 'echo $TMOUT' 均输出 600,并观察超时退出行为。

直接改 /etc/profile 是最简单、最可靠的全局生效方式,但必须写对两行:先赋值,再 export,缺一不可。
为什么只写 TMOUT=600 没用
这行只是在当前 Shell 设置一个局部变量,子 Shell、新启动的命令、甚至新开的终端标签都不会继承。你登录后运行 sh -c 'echo $TMOUT' 会输出空,就说明没导出成功。
- 必须写成两行:
TMOUT=600和export TMOUT - 不能合并为
export TMOUT=600—— 虽然语法合法,但某些老版本 Bash(如 RHEL 7 默认)会忽略这种写法 - 别在
~/.bashrc里配——它不被 SSH 登录或 TTY 首次加载,新手常踩这个坑
怎么验证 TMOUT 真正生效了
光看 echo $TMOUT 输出数字还不够,得确认它能传给子进程,且被 Shell 正确识别为超时控制变量。
- 登录后执行:
echo $TMOUT→ 应输出你设的数值(如600) - 再执行:
sh -c 'echo $TMOUT'→ 同样输出600,才说明已正确导出 - 最后测试行为:敲完回车后静置满设定秒数(比如 600 秒),终端应自动打印
timeout: login timed out并退出 - 如果没退出,检查是否被用户级配置覆盖:运行
grep -n TMOUT ~/.bashrc ~/.bash_profile 2>/dev/null
readonly TMOUT 到底该不该加
加了能防用户临时 unset 或改值,但代价是排障困难——一旦设错(比如写成 TMOUT=-1),连自己都登不进去,只能单用户模式修复。
- 生产环境初期建议跳过
readonly,先跑一周确认无误 - 真要加固,放在
/etc/profile末尾,顺序必须是:export TMOUT=600在前,readonly TMOUT在后 - 切勿在
/etc/profile.d/下放脚本并source它——某些运维工具包会在之后执行unset TMOUT,导致白配
为什么改了 /etc/profile 还不生效
常见原因不是语法错,而是加载路径不对或被覆盖。
- 已登录用户必须手动执行:
source /etc/profile,否则只对新登录会话生效 - Zsh 用户注意:
/etc/profile对 Zsh 默认不生效,得改/etc/zsh/zprofile或/etc/zsh/zshenv - 某些发行版(如 Ubuntu)默认用
~/.profile加载用户配置,若里面写了TMOUT=0,会覆盖系统级设置 - 检查是否被
systemd --user或桌面环境接管:GNOME/KDE 终端可能绕过/etc/profile,优先读~/.bashrc
真正麻烦的不是设多少秒,而是确保它从登录那一刻起就在所有子 Shell 中稳定存在——哪怕用户开十个 screen 或 tmux 窗口,每个都得受控。这点靠反复验证 sh -c 'echo $TMOUT' 最实在,别信“看起来写了就行”。


















