必须同时配置shell层tmout超时和ssh层clientalive机制:一、/etc/profile.d/autologout.sh设tmout=900并只读导出;二、sshd_config中设clientaliveinterval 300与clientalivecountmax 1;三、辅以定时脚本清理非工作时段会话。

要让系统用户在空闲一段时间后自动强制下线,防止因终端无人值守导致的越权风险,必须同时覆盖Shell层输入空闲和SSH连接层网络空闲两种场景。单配一种容易被绕过,生产环境需双机制协同生效。
一、全局 Shell 空闲超时(管本地终端与 SSH 的 Bash/Zsh 会话)
该设置对所有新登录的交互式 Bash/Zsh 用户生效,包括本地 TTY 和 SSH 登录后的 shell:
- 创建独立配置文件:
sudo nano /etc/profile.d/autologout.sh - 写入以下三行(关键:只读 + 导出,防用户 unset 或修改):
TMOUT=900readonly TMOUTexport TMOUT - 赋予执行权限:
sudo chmod +x /etc/profile.d/autologout.sh
✅ 效果:用户 15 分钟无键盘输入,终端显示 timed out waiting for input: auto-logout 并退出登录。普通用户无法取消或覆盖此设置。
二、SSH 连接保活探测(管网络假活跃、休眠重连等绕过场景)
仅靠 TMOUT 无法应对笔记本休眠后重连、防火墙中断但进程未死等情况,必须由 SSH 服务端主动探测:
一款AI工具,主要用于在持久tmux会话中运行AI编码代理(Codex、Claude Code),使用Ralph重试循环和完成钩子处理多步骤编码任务,适合需要提升相关任务效率的用户。
- 编辑
/etc/ssh/sshd_config,确保以下两行启用且数值匹配目标时长:ClientAliveInterval 300(每 5 分钟发一次心跳)ClientAliveCountMax 1(连续 1 次无响应即断开) - 重启服务生效:
sudo systemctl restart sshd
✅ 效果:SSH 连接实际空闲满 5 分钟即断开,提示 Connection closed by remote host。该机制不依赖终端输入,专治“看似在线实则离线”的风险会话。
三、补充:非工作时段强制清理跨时存活会话
仅限制新登录不够——若用户在 17:59 登录,可能持续到凌晨。需定时清理已存在但违反时段策略的活跃会话:
- 新建脚本:
sudo nano /usr/local/bin/clean-offhours-sessions.sh - 内容示例(以禁止 18:00–07:59 期间 admin 用户活跃为例):
#!/bin/bashwho | awk '$1=="admin" && $3 !~ /^(08|09|10|11|12|13|14|15|16|17):[0-9]{2}$/ {print $2}' | xargs -r kill -9 - 添加定时任务(如每天 18:00 执行):
sudo crontab -e→ 添加:0 18 * * * /usr/local/bin/clean-offhours-sessions.sh
⚠️ 注意:该脚本需配合明确的登录时段策略(如 PAM time.conf 或 login.defs 限制),否则仅作兜底清理。
四、验证与避坑要点
配置完成后务必验证,常见失效原因有:
- 图形终端(GNOME Terminal、Konsole)不读取 TMOUT —— 正常,它们应由桌面环境锁屏策略管理(如
gsettings set org.gnome.desktop.session idle-delay 900) - 运行
vim、htop、less等全屏程序时,TMOUT 计时暂停 —— 属设计行为,非配置错误 - 使用
su -或sudo -i切换用户后,新 shell 不继承原 TMOUT —— 应确保/etc/profile.d/autologout.sh对所有 shell 启动路径生效(Bash/Zsh 默认支持) - 修改
sshd_config后未重启 sshd —— 必须执行sudo systemctl restart sshd,否则配置不加载










