TMOUT需在/etc/profile.d/autologout.sh中统一配置export TMOUT=600和readonly TMOUT,确保sudo -i等提权会话继承生效;同时在/etc/sudoers中添加Defaults env_keep += "TMOUT"以保留变量,避免用户级配置失效。

sudo 本身不直接读取或继承 TMOUT 变量,它启动的是一个新 shell(如 /bin/bash),而该 shell 是否受 TMOUT 控制,取决于这个新 shell 的启动方式和环境继承逻辑。用户执行 sudo -i 或 sudo bash 后仍长时间空闲却未登出,根本原因不是 sudo “漏配 TMOUT”,而是:
-
sudo默认重置环境变量(包括TMOUT),除非显式保留; - 即使
TMOUT被传入,新 shell 若以非登录方式启动(如sudo bash),可能不加载/etc/profile,导致TMOUT未生效; -
sudo -i虽模拟登录 shell,但若目标用户(如 root)的~/.bashrc或~/.bash_profile中未设置或清除了TMOUT,依然无效。
所以,要让 sudo 提权后的会话也受空闲超时控制,关键不是“在 sudo 里配 TMOUT”,而是确保提权后启动的 shell 环境中 TMOUT 已正确定义、导出且不可绕过。具体做法如下:
✅ 让 sudo 后的 shell 继承并生效 TMOUT
-
启用环境变量保留(推荐)
编辑/etc/sudoers(用sudo visudo安全修改):Defaults env_keep += "TMOUT"
这样
sudo -i或sudo bash会把当前用户的TMOUT值传给新 shell。
⚠️ 注意:仅保留变量还不够——新 shell 必须是交互式且加载了export TMOUT=...的配置文件。 -
统一在系统级配置中定义并锁定 TMOUT(最可靠)
在/etc/profile.d/autologout.sh中写入(确保有执行权限):export TMOUT=600 readonly TMOUT
因为
/etc/profile.d/*.sh会被所有登录 shell(包括sudo -i启动的 root shell)自动 source,且readonly可防unset或覆盖。✅ 验证:
sudo -i进入后执行echo $TMOUT,应输出600;静默等待 10 分钟,应自动退出。
⚠️ 避免常见失效场景
sudo su -或sudo -i启动的是目标用户的登录 shell,它读的是目标用户的配置文件(如/root/.bash_profile)。若 root 用户的配置里没TMOUT,或写了unset TMOUT,就会失效。
→ 解决方案:统一用/etc/profile.d/方式配置,它优先于用户级文件,且对所有用户(含 root)生效。sudo -s默认启动非登录 shell,不读/etc/profile,只读~/.bashrc(当前用户,非目标用户)。
→ 不建议用-s做长期管理;如必须使用,确保当前用户的~/.bashrc里有source /etc/profile或直接export TMOUT=600。某些发行版(如 Ubuntu)默认
sudo启用env_reset,会清空大部分环境变量。仅靠env_keep += "TMOUT"不足以覆盖所有情况。
→ 更稳妥的做法是:不在依赖环境传递,而让每个 shell 自身加载 TMOUT —— 即坚持使用/etc/profile.d/autologout.sh+readonly,这是最健壮的路径。
? 不推荐的做法
- 在
/etc/sudoers中写Defaults env_reset然后试图env_keep多个变量:易遗漏、难维护、权限策略复杂化。 - 在用户
~/.bashrc中设TMOUT并期望sudo -i继承:失败率高,因sudo -i切换到 root 后加载的是 root 的配置,不是你的。 - 用
sudo TMOUT=600 bash临时赋值:TMOUT=600 bash本身不导出,子 shell 不继承;即使export TMOUT=600; sudo bash,sudo仍可能重置环境。
? 快速验证是否生效
- 普通用户下执行:
sudo -i echo $TMOUT # 应输出 600
- 不输入任何命令,等待超过设定时间(如 610 秒),观察是否自动退出并显示
timed out waiting for input。 - 若未退出,检查:
-
sudo -i后是否真进了 root shell(whoami); -
/etc/profile.d/autologout.sh是否存在、可执行、内容正确; - root 用户的
~/.bash_profile是否意外unset TMOUT。
-
本质上,sudo 提权后的超时控制,不是 sudo 的功能配置,而是shell 环境的一致性治理问题。统一、只读、系统级注入 TMOUT,是最简单也最有效的解法。


















