全局配置TMOUT需在/etc/profile中先赋值再export,如TMOUT=600和export TMOUT,确保登录Shell启动时生效、可继承;用户级配置应写入~/.bash_profile或~/.zshrc而非~/.bashrc;加固须用readonly锁定并协同设置ClientAliveInterval小于TMOUT。

运维人员需要在Linux终端中设置空闲超时自动退出,防止无人值守会话被恶意利用,必须让TMOUT变量在登录Shell启动时就生效、可继承、不可绕过。
全局统一配置TMOUT(所有用户生效)
这一步适用于服务器集群、跳板机等需强制统一策略的场景,直接写入系统级Profile文件,确保SSH和TTY登录均触发。
用sudo权限编辑/etc/profile:sudo nano /etc/profile
在文件末尾添加两行,【必须先赋值再export,缺一不可】:
TMOUT=600
export TMOUT
立即加载新配置:source /etc/profile
验证是否生效:echo $TMOUT 应输出600;再运行 bash -c 'echo $TMOUT' 确认子Shell也继承该值。若后者为空,说明只设了TMOUT没export,配置无效。
仅对某运维账号单独设置
当只需限制特定高权限账号(如deploy、admin)而保留开发账号灵活性时,采用用户级配置更稳妥。
方法一:编辑其~/.bash_profile(Bash用户首选)
vim ~/.bash_profile → 末尾添加 export TMOUT=300 → source ~/.bash_profile
方法二:编辑其~/.zshrc(Zsh用户适用)
vim ~/.zshrc → 添加 export TMOUT=300 → source ~/.zshrc
【注意:不要写进~/.bashrc!该文件不被SSH首次登录加载,配置后仍无效果】
加固防篡改:加readonly并隔离配置路径
普通用户可通过unset TMOUT或重新赋值绕过限制,生产环境必须锁定变量。
第一步:创建专用脚本 sudo nano /etc/profile.d/autologout.sh
第二步:写入三行内容(顺序不能错):
TMOUT=480
export TMOUT
readonly TMOUT
第三步:赋予执行权限 sudo chmod +x /etc/profile.d/autologout.sh
第四步:验证锁定状态 运行 declare -p TMOUT,输出中必须含 “readonly” 字样;再尝试 unset TMOUT,应报错 “cannot unset: readonly variable”。
协同配置SSH保活参数(必做)
只设TMOUT会导致SSH连接挂着但Shell已退出,形成安全缝隙——网络设备可能维持TCP连接,攻击者可复用该连接注入命令。
编辑SSH服务端配置:sudo nano /etc/ssh/sshd_config
取消注释并修改两行:
ClientAliveInterval 540
ClientAliveCountMax 1
【ClientAliveInterval必须小于TMOUT值,否则sshd会在Shell检测前强行断连,导致登出提示异常或审计日志缺失】
重启SSH服务使配置落地:sudo systemctl restart sshd


















