TTY会话超时由TMOUT环境变量控制,需在/etc/profile中全局配置并防止覆盖,且仅对TERM="linux"的TTY生效;SSH需单独配置ClientAliveInterval;失效常见原因包括shell重置、systemd-logind接管及全屏程序暂停计时;登出后须配合loginctl lock-session或logind空闲锁屏机制才能真正安全。

TTY会话超时由TMOUT环境变量控制
Linux TTY终端(非图形界面下的Ctrl+Alt+F1~F6)默认不自动登出,必须显式配置。核心机制是shell读取TMOUT变量:只要它被设为正整数,bash或sh就会在指定秒数无操作后执行exit,触发登出。
常见错误是只在用户~/.bashrc里设置——这仅对交互式非登录shell生效,而TTY首次登录走的是登录shell,读/etc/profile或/etc/bash.bashrc优先级更高。
- 全局生效:在
/etc/profile末尾追加export TMOUT=900(15分钟),确保所有TTY登录用户受控 - 避免覆盖:检查
/etc/profile.d/下是否有脚本重置TMOUT(比如某些运维工具包会清空它) - 注意兼容性:
TMOUT对dash(Debian/Ubuntu的/bin/sh)无效,若系统用dash作默认sh,需改用bash作为TTY登录shell或换方案
SSH会话和TTY不能共用同一套TMOUT逻辑
很多人误以为配了TMOUT就一劳永逸,但SSH会话通常走PAM认证链,和纯TTY路径不同。SSH即使读到TMOUT,也可能被ClientAliveInterval等SSH守护参数覆盖或干扰。
真实场景中,你可能需要同时处理两种会话:本地物理机TTY要快速锁屏(如5分钟),而SSH连接需更宽松(如30分钟)且依赖服务端心跳保活。
- TTY专用:坚持用
TMOUT,配合readonly TMOUT防止用户篡改 - SSH专用:关掉
TMOUT影响,在/etc/ssh/sshd_config里设ClientAliveInterval 1800和ClientAliveCountMax 0,让sshd主动断连 - 别混用:在
/etc/profile里加判断[[ $TERM == "linux" ]] && export TMOUT=300,只对TTY生效,避免污染SSH环境
TMOUT失效的三个典型原因
配完没反应?大概率掉进了这几个坑。不是配置没写,而是被其他机制拦截或绕过了。
-
sudo -i或su -切换用户后,新shell会重新读配置,但若目标用户~/.bashrc里有unset TMOUT或TMOUT=0,立刻失效 - 某些发行版(如CentOS Stream)默认启用
systemd-logind,它通过InhibitDelayMaxSec=30等参数接管空闲管理,优先级高于TMOUT,需同步调/etc/systemd/logind.conf里的IdleAction=lock和IdleActionSec=300 - 用户运行了
vim、less、top等全屏程序,它们会接管终端输入,期间TMOUT计时暂停——这不是bug,是bash设计行为,但容易让人误判“超时没起作用”
真正安全的配置得兼顾“登出”和“锁屏”
单纯TMOUT登出只是清掉shell进程,TTY设备本身仍处于已登录状态,按任意键就能回到登录提示符——这不算真正安全。物理访问下,别人可以快速按回车跳过密码再进系统。
关键点在于:登出后必须让TTY进入不可交互的锁定状态,或者强制返回图形登录管理器(如果有)。这没法靠shell变量解决,得动logind或getty。
- 最简方案:在
/etc/profile里export TMOUT=300后加一行trap 'loginctl lock-session' EXIT,确保登出时锁住当前session - 更彻底:禁用
getty自动重启,在/etc/systemd/logind.conf设NAutoVTs=6和ReserveVT=6,再配合logind的IdleAction=lock,让空闲直接锁屏而非登出 - 注意副作用:
loginctl lock-session在无图形环境(纯TTY)下可能报错,先用loginctl show-session $(loginctl | grep "seat0" | awk '{print $1}') -p Type确认session类型是否为tty,再决定是否启用
复杂点在于logind、getty、shell变量、PAM模块四层叠加,任何一层漏配都会让超时形同虚设。尤其物理服务器上,别只盯着TMOUT改,得查loginctl list-sessions输出里每个session的实际IdleSinceMonotonic值,才知道空闲计时到底从哪开始算。










