非必要账号指UID在1–999且shell为/bin/bash或/bin/sh的系统账号,如lp、news、games等;sync、shutdown等虽不提供登录但shell若为/bin/bash仍有风险;adm、daemon等可能被服务依赖,root及现代服务账号不可删。

哪些账号算“非必要”?先看 UID 和用途
系统默认账号是否可关,不能只看名字。关键看两点:UID 是否在 1–999 范围(RHEL/CentOS/Debian 默认规则),以及当前 shell 是否为 /sbin/nologin 或 /usr/sbin/nologin。像 lp、news、games、uucp、operator 这类账号,多数已无服务依赖,且 shell 常为 /bin/bash 或 /bin/sh——这就构成风险。
-
sync、shutdown、halt是内核级命令调用账号,不提供登录入口,但 shell 若为/bin/bash,仍可能被 su 或 ssh 利用 -
adm、daemon、mail在部分发行版中仍被日志或邮件服务引用,直接删可能中断rsyslog或postfix -
root(UID=0)、sshd、systemd-network、polkitd等现代服务账号,shell 通常已是/usr/sbin/nologin,不要动
推荐先跑这行命令定位目标:
lp:/bin/bash
- 单个操作:
sudo usermod -s /sbin/nologin lp - 批量操作(谨慎!建议先加
echo预览):awk -F':' '$1 ~ /^(lp|news|games|uucp|operator)$/ && $7 !~ /nologin|false$/ {print "sudo usermod -s /sbin/nologin " $1}' /etc/passwd | sh - 注意跳过
root、sshd、systemd-network:加条件$1 !~ /^(root|sshd|systemd-network)$/
改完必须确认 /etc/shells 包含该路径:
grep nologin /etc/shells
如果没输出,补上:echo "/sbin/nologin" | sudo tee -a /etc/shells
验证是否真生效:三件事缺一不可
改完 /etc/passwd 不代表完事。必须实测:
- 查文件:
grep ^lp: /etc/passwd→ 第七列应为/sbin/nologin - 测试登录:
su - lp或ssh lp@localhost→ 应立即退出,并显示This account is currently not available. - 验证服务:
sudo systemctl restart rsyslog cron cups(按你实际启用的服务选)→ 查journalctl -u rsyslog -n 20,确认无 “User lp does not exist” 类报错
特别注意:sync 和 shutdown 账号即使 shell 改了,sudo reboot 仍正常;但若你手动写脚本用 su -c '...' sync,就得同步检查脚本逻辑。
为什么别急着 userdel?组依赖和残留家目录是坑
userdel -r lp 看似干净,但容易踩三个坑:
-
lp组可能还被 CUPS 的配置文件(如/etc/cups/cups-files.conf)引用,删组后权限校验失败 -
games账号的家目录(/usr/games)常被某些 legacy 二进制依赖,删目录可能让fortune或bsdgames报错 -
news账号若曾运行过inn,其 spool 目录(/var/spool/news)可能被rsyslog的 imfile 模块监控,删账号不删目录会导致日志轮转异常
真正需要删的,只有你明确确认过以下四点的账号:
-
systemctl list-dependencies --reverse --type=service lp.target(或对应账号名)返回空 -
grep -r lp /etc/systemd/ /usr/lib/systemd/ 2>/dev/null无结果 -
crontab -u lp -l 2>/dev/null和sudo -u lp ls /var/spool/cron/crontabs/ 2>/dev/null均失败 -
getent group lp返回空,且grep :lp: /etc/group仅剩组定义行(无成员)
复杂点在于:很多“默认账号”不是孤立存在,而是嵌套在 systemd、PAM、auditd 的策略链里。改 shell 是最小侵入动作,删账号是最后一步——而且往往根本不需要删。











