应使用 lastlog -b 90 筛选90天未登录用户,过滤系统账号后,用 usermod -s /sbin/nologin 禁用交互式登录,并同步清理 sudo 权限、crontab、systemd 用户服务及 SSH 密钥。

如何快速识别并禁用 90 天未登录的用户
Linux 没有内置“自动禁用闲置账户”的开关,得靠 lastlog 和 chage 配合判断。关键不是看文件修改时间,而是查最后一次成功登录的系统记录。
-
lastlog -b 90列出所有 90 天内没登录过的用户(-b表示 “before”,注意不是-n) - 过滤掉系统账号:加
| awk '$1 !~ /^(root|sync|shutdown|halt|operator|nobody|.*daemon)/ {print $1}' - 禁用前先确认该用户没在运行关键服务:
ps -u username或检查/etc/passwd中 shell 是否为/sbin/nologin - 真正禁用用
usermod -s /sbin/nologin username,别用passwd -l—— 后者只锁密码,SSH 密钥仍可能绕过
chage 设置密码过期 ≠ 禁用账户,但能联动控制
chage 管的是密码生命周期,不是账户状态。但它可以间接触发登录拦截,尤其配合 PAM 的 pam_faildelay.so 或 SSH 的 MaxAuthTries 时容易误判为“已禁用”。
- 设密码过期:
chage -M 90 -W 7 username(90 天有效期,提前 7 天警告) - 强制首次登录改密:
chage -d 0 username(下次登录必须重设密码) - 账户完全过期(不再允许任何登录):
chage -E $(date -d '+30 days' +%Y-%m-%d) username - 注意:
chage -E 0是立即过期,chage -E -1才是取消过期限制 —— 很多人填错成0导致账户意外失效
批量禁用后,sudo 权限和 cron 任务不会自动清除
禁用 shell 只阻止交互式登录,但 sudo 规则、crontab、systemd user units 依然存在,可能被提权或误触发。
- 删 sudo 权限:
deluser username sudo(Ubuntu/Debian)或手动删/etc/sudoers.d/username - 清空用户定时任务:
crontab -u username -e改为空,或直接crontab -u username -r - 停用用户级 systemd 服务:
sudo systemctl --user stop 'app*.service'+sudo systemctl --user disable 'app*.service' - 别漏掉
~username/.bash_history和~username/.ssh/authorized_keys—— 这些文件残留可能被后续恢复账户时误用
脚本自动化时,/etc/shadow 时间戳不可信,必须用 lastlog
/etc/shadow 第三列是“上次密码修改时间”,不是登录时间;很多用户从不改密,这列十几年不变,完全不能反映活跃度。
- 唯一可靠依据是
lastlog输出的“Latest”时间列,它来自/var/log/lastlog二进制文件 - 脚本里解析
lastlog要用awk '{if ($5 != "Never") print $1,$5}',因为字段数不固定,第 5 列才是日期 - 注意时区:
lastlog默认按系统本地时区输出,跨时区服务器批量处理时建议先统一设TZ=UTC - 如果
/var/log/lastlog被轮转或清空过,lastlog会显示 “**Never logged in**”,此时需结合auth.loggrep 登录事件回溯,但性能开销大,不建议日常巡检用
账户禁用不是单点操作,shell、密码策略、sudo、cron、SSH 密钥、systemd 用户实例要同步清理;最常被跳过的其实是 crontab -r 和 systemctl --user disable —— 它们不报错,也不显式提醒,但隐患藏得深。

















