linux无原生自动归档冻结账户功能,需组合lastlog识别90天未登录用户、usermod -s /sbin/nologin禁用登录,并清理sudo规则、crontab、systemd用户服务及ssh密钥,最后通过cron每日执行脚本实现自动化。

Linux本身不提供“自动归档冻结”账户的原生功能,所谓“归档冻结”需拆解为两层动作:一是**识别并禁用账户登录能力**,二是**清理或隔离其权限与运行态资源**。整个过程必须靠组合命令+定时任务实现,不能依赖单一配置。
准确识别90天未登录的普通用户
关键依据是lastlog,不是/etc/shadow时间戳或文件修改时间——后者完全不可靠。
- 运行
lastlog -b 90列出所有90天内未成功登录的用户(-b表示“before”,非-n) - 过滤掉系统账号:
lastlog -b 90 | awk '$1 !~ /^(root|sync|shutdown|halt|operator|nobody|.*daemon)/ && $5 != "Never" {print $1}'(第5列是登录时间,排除“Never”可避开从未登录过的账号) - 确认该用户没在跑服务:
ps -u username > /dev/null || echo "safe to disable"
真正禁用登录,而非仅锁密码
用passwd -l只加感叹号锁密码,SSH密钥仍可绕过;应改shell为/sbin/nologin。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 执行
usermod -s /sbin/nologin username,彻底禁止交互式登录 - 避免误操作:
chage -E 0会让账户立即过期,chage -E -1才是取消过期限制 - 若需联动密码控制,可加
chage -M 90 -W 7 username(密码90天一换,提前7天提醒)
同步清理残留权限与自动任务
禁用shell后,sudo规则、crontab、systemd用户服务、SSH密钥仍有效,可能被提权或误触发。
- 删除sudo权限:
rm -f /etc/sudoers.d/username - 清空定时任务:
crontab -u username -r - 停用用户级服务:
sudo systemctl --user stop 'app*.service' && sudo systemctl --user disable 'app*.service' - 检查并移除
/home/username/.ssh/authorized_keys,防止后续恢复时被复用
用Cron每日自动执行整套流程
把上述逻辑写成脚本,再加入系统定时任务,就实现了“自动冻结”效果。
- 脚本示例开头加
TZ=UTC,避免跨时区服务器时间解析偏差 - 在
/etc/cron.daily/disable-idle-users中添加执行命令,并设可执行权限:chmod +x - 脚本内建议先记录操作日志:
echo "$(date): disabled $user" >> /var/log/account-freeze.log - 生产环境务必先在测试账号上验证全流程,再批量运行










