最稳妥的限制方式是将服务账户 shell 设为 /sbin/nologin 或 /usr/sbin/nologin,需先验证路径存在、检查 UID 范围、确认 /etc/shells 合法性,再用 usermod -s 安全修改,最后通过 getent passwd 验证第七列生效。

直接用 usermod -s /sbin/nologin 改,但必须先确认路径、检查 UID 范围、验证 /etc/shells,否则可能禁用失败甚至留空 shell 后门。
怎么确认系统里该用 /sbin/nologin 还是 /usr/sbin/nologin
不同发行版路径不一致:RHEL/CentOS 7+、Debian 10 及更早默认用 /sbin/nologin;Ubuntu 22.04+、Debian 12+ 默认用 /usr/sbin/nologin。写错路径会导致用户仍能获得空 shell 或登录失败却不报错。
- 查两个路径是否存在:
ls -l /sbin/nologin /usr/sbin/nologin 2>/dev/null - 看目标账号当前 shell:
getent passwd sync | cut -d: -f7 - 查自己当前 shell(作参考):
echo $SHELL
哪些账号该改?怎么批量识别
系统服务账号通常 UID 在 1–999(RHEL/CentOS 默认),名字常见如 sync、shutdown、daemon、mail 等。但不能盲目全改——root(UID=0)、systemd-network、sshd 等现代服务账号已设为 /usr/sbin/nologin 或受 systemd 管理,强行修改可能中断网络或 SSH。
- 列出待处理账号:
awk -F':' '$3 >= 1 && $3 - 跳过 root 和已加固账号:
awk -F':' '$3 >= 1 && $3
为什么不能直接编辑 /etc/passwd?
手动改字段易出错:少一个冒号、路径拼错、权限位错位,都可能导致 su 失败、login 拒绝、甚至系统无法启动。而且 usermod 会自动校验字段合法性,并同步更新 shadow 和 gshadow(如果涉及密码字段)。
- 单个改:
sudo usermod -s /sbin/nologin sync - 批量改(加
-p预览):awk -F':' '$3>=1 && $3 - 新建服务账号时直接指定:
sudo useradd -s /sbin/nologin -r -M serviceuser
改完为什么 su - username 还能进?
最常见原因是 /sbin/nologin 不在 /etc/shells 里。哪怕文件存在、路径写对,只要没列在合法 shell 列表中,su - 就会静默 fallback 到 /bin/sh 或直接报错退出,但不会阻断登录。
- 检查是否在列表:
grep nologin /etc/shells - 缺失就补上:
echo "/sbin/nologin" | sudo tee -a /etc/shells - 验证生效:
getent passwd sync | cut -d: -f7应输出/sbin/nologin,且su - sync显示This account is currently not available.
真正容易被忽略的是:改完后必须实测登录行为(su -、ssh)和服务功能(crond、rsyslog 是否照常运行),不能只看 /etc/passwd 第七列。有些系统会缓存用户数据库,getent passwd 比直接 cat /etc/passwd 更可靠。


















