配置Shell超时自动退出的核心是让交互式终端在无操作时主动终止会话,需正确导出TMOUT=600并写入/etc/profile或~/.bash_profile等登录Shell配置文件,配合readonly加固及SSH的ClientAliveInterval 300与ClientAliveCountMax 3协同断连。

配置 Shell 超时自动退出,核心是让交互式终端在无操作时主动终止会话,防止账号长期登录后被非法复用。这不是加个变量就完事,得确保它真生效、不被绕过、且覆盖本地和远程两种入口。
TMOUT 必须正确导出并写对位置
只写 TMOUT=600 没用,必须搭配 export TMOUT=600 才能传给子 Shell 和新命令行。关键还要写进对的配置文件:
- SSH 登录或 Ctrl+Alt+F2~F6 进入的 TTY 属于登录 Shell,优先读
/etc/profile(Bash)或/etc/zsh/zprofile(Zsh) - 别往
~/.bashrc里写——它只被非登录 Shell(比如 GNOME Terminal 新开标签)加载,对首次 SSH 登录无效 - 全系统生效:用
sudo nano /etc/profile,末尾加export TMOUT=600 - 仅限某运维账号:编辑其
~/.bash_profile,同样加该行;若文件不存在可新建
防绕过要靠 readonly + 权限管控
普通用户执行 unset TMOUT 就能临时关闭,所以生产环境不能只靠变量本身:
- 设完后追加
readonly TMOUT,这样用户无法修改或取消 - 但别一上来就加 readonly——万一值设错(比如写成 0 或负数),连自己都登不进去。建议先验证稳定,再加固
- 配合权限控制:限制用户修改
/etc/profile或其 home 目录下的 shell 配置文件 - 更稳妥做法:把配置放进
/etc/profile.d/autologout.sh,内容为三行:TMOUT=600、export TMOUT、readonly TMOUT,再chmod +x
单靠 TMOUT 不够,必须配 SSH 心跳断连
TMOUT 只管 Shell 层空闲,而 SSH 连接可能因网络设备超时、客户端休眠等原因“挂着不动”,形成安全缝隙:
- 编辑
/etc/ssh/sshd_config,确保有这两行:ClientAliveInterval 300(每 5 分钟发一次心跳)ClientAliveCountMax 3(连续 3 次无响应即断开,总空闲上限 15 分钟) - 改完重启服务:
sudo systemctl restart sshd - 验证:登录后运行
echo $TMOUT看是否输出 600;再用sh -c 'echo $TMOUT'确认子 Shell 也继承
清理残留进程,避免登出后服务还在跑
Shell 退出了,但用户之前启动的后台任务(如 nohup ./run.sh &)可能还在运行,占用资源、干扰审计:
- 启用 systemd 会话清理:在
/etc/systemd/logind.conf中设KillUserProcesses=yes,然后sudo systemctl restart systemd-logind - 或在 PAM 配置中加入:
session optional pam_systemd.so(写入/etc/pam.d/sshd或/etc/pam.d/login) - 验证:登出后再登录,执行
pgrep -u username应无输出











