TMOUT需在shell启动时作为环境变量存在且不可被覆盖,普通用户可通过修改~/.bashrc等文件绕过;有效防护须分层:/etc/profile中export TMOUT=900并readonly加固,chattr +i锁死所有shell配置文件,并配合SSH的ClientAliveInterval与ClientAliveCountMax实现网络层兜底断连。

普通用户能改自己的.bashrc,TMOUT就形同虚设
TMOUT生效的前提是它在shell启动时已作为环境变量存在。如果用户在~/.bashrc里写unset TMOUT或TMOUT=0,再source ~/.bashrc,当前会话立刻失效——这不是bug,是bash设计使然。系统级/etc/profile里的export TMOUT=900只影响初始加载,后续被覆盖就没了。
绕过.bashrc篡改的三种实际手段
不能靠“教育用户别乱改”,得用机制堵住路径:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
/etc/profile中设置后,立即在末尾追加readonly TMOUT——这能防止后续脚本用TMOUT=赋值,但unset TMOUT仍可成功(bash允许unset readonly变量) - 把
~/.bashrc设为不可修改:chattr +i ~/.bashrc。注意:必须用root执行,且用户无法自行chattr -i;但该操作会阻断所有合法更新(如加新别名),需配套维护流程 - 不依赖
.bashrc,改用/etc/profile.d/tmout.sh(确保它按字母序在用户.bashrc之前加载),并在其中用trap 'exit 1' DEBUG监控TMOUT是否被unset——过于激进,易引发兼容问题,不推荐
真正有效的组合策略
单一手段必被绕过,必须分层控制:
- 基础:在
/etc/profile中写export TMOUT=900+readonly TMOUT - 加固:用
find /home -maxdepth 2 -name ".bashrc" -exec chattr +i {} \;锁死所有.bashrc(执行前确认无自动化运维依赖修改该文件) - 兜底:SSH层配
ClientAliveInterval 300和ClientAliveCountMax 3,确保即使shell层TMOUT失效,网络连接也会在15分钟内强制断开 - 审计:用
auditctl -w ~/.bashrc -p wa -k bashrc_mod记录任何修改尝试,配合日志告警
容易被忽略的关键点
很多人以为锁了.bashrc就万事大吉,但忘了~/.bash_profile、~/.profile甚至~/.bash_login同样能覆盖TMOUT。只要有一个可写且被加载的shell初始化文件,防线就破了。更隐蔽的是,用户可能用bash --rcfile /tmp/malicious绕过所有家目录配置——所以最终还得靠chattr +i锁住整个/home/用户名目录的元数据(需谨慎评估业务影响)。

















