Linux TTY超时退出需TMOUT变量与SSH ClientAlive双机制协同:前者控制Shell空闲终止,后者由sshd保活探测,二者缺一不可;还需配合PAM/systemd清理残留进程。

Linux系统TTY终端超时自动退出,核心靠两个机制协同:一个是Shell层的TMOUT变量控制交互会话空闲终止,另一个是内核/SSH层对PTY连接本身的保活与断连管理。两者作用范围不同、生效层级不同,单独设一个容易漏掉关键路径,尤其在等保或生产安全基线场景下必须双轨并行。
TTY本地终端用TMOUT强制限时
该方式对直接登录控制台(如Ctrl+Alt+F1~F6)或本地虚拟终端有效,依赖bash/zsh等支持该变量的shell。
- 统一配置所有用户:编辑/etc/profile,末尾添加两行
TMOUT=300export TMOUT - 立即生效:运行
source /etc/profile,新登录终端即启用5分钟无操作退出 - 验证是否加载:任意终端执行
echo $TMOUT,应输出300 - 防绕过增强:改用/etc/profile.d/autologout.sh脚本,内容含
readonly TMOUT,再加执行权限,普通用户无法unset
SSH远程连接靠ClientAlive参数保活
仅设TMOUT对SSH无效——因为sshd可能在shell感知前就已断开连接。必须修改SSH服务端配置,由守护进程主动探测和清理。
- 编辑/etc/ssh/sshd_config,确保以下两行启用且数值合理:
ClientAliveInterval 600(每10分钟发一次心跳)ClientAliveCountMax 1(只允许1次失败,即10分钟后无响应即断开) - 重启服务使配置落地:
sudo systemctl restart sshd - 检查是否生效:
sudo ss -tuln | grep :22确认sshd在运行;也可临时用ssh -o ServerAliveInterval=30 user@host客户端侧测试
会话残留进程需配合systemd或loginctl清理
自动退出后,用户启动的后台进程(如nohup、screen、未detach的脚本)可能仍在运行,占用资源且影响审计。不能只靠超时,还得清理会话上下文。
- 启用PAM session限制:在/etc/pam.d/sshd或/etc/pam.d/login中加入
session optional pam_systemd.so - 登出后自动杀掉用户全部进程树:
loginctl terminate-user username可手动触发;更稳妥的是配置/etc/systemd/logind.conf中KillUserProcesses=yes并重启systemd-logind - 验证效果:登录后运行
sleep 3600 &,超时退出再登录,执行pgrep -u username应无输出
临时禁用或调试技巧
开发或排障时需要临时绕过超时,但不建议长期关闭,更不要直接删配置文件。
- 当前会话取消限制:
unset TMOUT(仅本次生效) - SSH连接保持活跃:
while :; do sleep 60; echo -ne '\001\002'; done &模拟输入(慎用,可能干扰命令) - 快速定位谁设置了TMOUT:
grep -r "TMOUT=" /etc/profile* ~/.bash* 2>/dev/null - 查实际生效值:
declare -p TMOUT比echo $TMOUT更准,能显示readonly属性










