Linux系统TTY终端会话超时自动注销安全配置

1次阅读

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

Linux系统TTY终端会话超时自动注销安全配置

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(比如某些运维工具包会清空它)
  • 注意兼容性:TMOUTdashdebian/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 1800ClientAliveCountMax 0,让sshd主动断连
  • 别混用:在/etc/profile里加判断[[ $TERM == "linux" ]] && export TMOUT=300,只对TTY生效,避免污染SSH环境

TMOUT失效的三个典型原因

配完没反应?大概率掉进了这几个坑。不是配置没写,而是被其他机制拦截或绕过了。

  • sudo -isu -切换用户后,新shell会重新读配置,但若目标用户~/.bashrc里有unset TMOUTTMOUT=0,立刻失效
  • 某些发行版(如centos Stream)默认启用systemd-logind,它通过InhibitDelayMaxSec=30等参数接管空闲管理,优先级高于TMOUT,需同步调/etc/systemd/logind.conf里的IdleAction=lockIdleActionSec=300
  • 用户运行了vimlesstop等全屏程序,它们会接管终端输入,期间TMOUT计时暂停——这不是bug,是bash设计行为,但容易让人误判“超时没起作用”

真正安全的配置得兼顾“登出”和“锁屏”

单纯TMOUT登出只是清掉shell进程,TTY设备本身仍处于已登录状态,按任意键就能回到登录提示符——这不算真正安全。物理访问下,别人可以快速按回车跳过密码再进系统。

关键点在于:登出后必须让TTY进入不可交互的锁定状态,或者强制返回图形登录管理器(如果有)。这没法靠shell变量解决,得动logindgetty

  • 最简方案:在/etc/profileexport TMOUT=300后加一行trap 'loginctl lock-session' EXIT,确保登出时锁住当前session
  • 更彻底:禁用getty自动重启,在/etc/systemd/logind.confNAutoVTs=6ReserveVT=6,再配合logindIdleAction=lock,让空闲直接锁屏而非登出
  • 注意副作用:loginctl lock-session在无图形环境(纯TTY)下可能报错,先用loginctl show-session $(loginctl | grep "seat0" | awk '{print $1}') -p Type确认session类型是否为tty,再决定是否启用

复杂点在于logindgetty、shell变量、PAM模块四层叠加,任何一层漏配都会让超时形同虚设。尤其物理服务器上,别只盯着TMOUT改,得查loginctl list-sessions输出里每个session的实际IdleSinceMonotonic值,才知道空闲计时到底从哪开始算。

text=ZqhQzanResources