非业务默认系统账号指UID虽为1000但实际不用于人机交互的服务账户,如www-data、postgres、mysql等,需结合getent passwd查GECOS字段、主目录路径及su登录能力综合判定。

哪些账号属于“非业务默认系统账号”
Linux 系统中,UID /etc/shadow 中设密码)的账号通常为服务/系统账号,如 daemon、sys、sync、games、lp、mail、nobody 等。它们的 /etc/passwd 第七字段(登录 Shell)本应是 /usr/sbin/nologin 或 /bin/false,但有时被误设为 /bin/bash 或 /bin/sh,导致可交互登录——这是安全风险点。
判断依据优先级:UID 且 不在业务白名单(如 root、admin、deploy 等需保留登录的账号)中 且 当前 Shell 不是 /usr/sbin/nologin、/bin/false、/bin/true、/sbin/nologin(注意路径差异)。
用 awk + usermod 批量修改 Shell
直接改 /etc/passwd 文件极危险,必须用 usermod -s;否则可能破坏文件格式或触发 PAM 锁定。
- 先确认目标账号列表(预览,不执行):
awk -F: '$3 < 1000 && $7 !~ /^\/(usr\/)?sbin\/nologin$|^\/bin\/(false|true)$|^\/dev\/null$/ && !/^root:/ && !/^admin:/ && !/^deploy:/ {print $1, $7}' /etc/passwd - 批量设置为
/usr/sbin/nologin(推荐统一路径):awk -F: '$3 < 1000 && $7 !~ /^\/(usr\/)?sbin\/nologin$|^\/bin\/(false|true)$|^\/dev\/null$/ && !/^root:/ && !/^admin:/ && !/^deploy:/ {print $1}' /etc/passwd | xargs -r -I{} usermod -s /usr/sbin/nologin {} -
xargs -r防止空输入报错;-I{}确保每个账号单独调用usermod,避免因某个账号不存在导致整批失败
为什么不能直接 sed 替换 /etc/passwd
sed -i 直接改 /etc/passwd 是高危操作:一旦正则写错(比如匹配到 root 行)、或字段分隔符处理不当(如用户名含 :,虽罕见但理论上可能),会导致系统无法登录甚至启动失败。
-
usermod会校验用户存在性、Shell 路径合法性,并原子更新/etc/passwd和影子数据库(如启用 shadow) -
/usr/sbin/nologin和/sbin/nologin在部分发行版中是同一文件(硬链接),但路径不同;usermod接受任意合法路径,而sed无法判断语义是否合理 - 某些系统(如 RHEL 8+)默认使用
/usr/sbin/nologin,硬写/sbin/nologin可能被pwck报告为异常
执行前必须做的三件事
这步跳过等于埋雷。
- 用
whoami和id确认当前会话不是以待清理账号运行(避免自己被锁) - 检查
/etc/shadow中对应账号是否已禁用(passwd -l username或字段第二列为!或!!),若已锁定,Shell 改不改影响不大,但建议仍统一为nologin - 备份关键文件:
cp /etc/passwd /etc/passwd.$(date +%s).bak<br>cp /etc/shadow /etc/shadow.$(date +%s).bak
—— 不要只依赖快照或 LVM,usermod出错时能秒级恢复
真正麻烦的不是脚本怎么写,而是没想清楚哪些账号该留、哪些能动;root 的 Shell 绝对不能碰,sshd、systemd-network 这类新 systemd 服务账号 UID 可能 >1000,不能靠 UID 判断,得结合 getent passwd 和实际业务进程看。


















