必须先设置密码策略,因useradd创建的用户无密码,默认无法登录;需用chpasswd或openssl passwd -6生成SHA-512加密密码写入/etc/shadow,避免账户处于锁定状态。

用 useradd 批量建用户前必须设好密码策略
Linux 默认不允许空密码,useradd 创建的用户没有密码,也无法登录。不提前处理,脚本跑完用户全是“锁住状态”。
- 必须配合
chpasswd或openssl生成加密密码后批量写入/etc/shadow - 更稳妥的做法是用
useradd -p直接传入已加密的密码字符串(注意:不是明文) - 密码加密要用
openssl passwd -6(推荐 SHA-512),-1(MD5)已不安全,-5(SHA-256)兼容性略差 - 如果系统启用了
authconfig或sssd,还需确认PASS_MIN_LEN和ENCRYPT_METHOD在/etc/login.defs中匹配
写循环脚本时别硬编码家目录和 shell 路径
直接写 /home/username 或 /bin/bash 看似省事,但一换发行版就出问题:CentOS 默认用 /bin/bash,Alpine 用 /bin/sh,Ubuntu 22.04+ 默认禁用 /bin/bash 的交互式登录(需显式启用)。家目录路径也受 CREATE_HOME 和 HOME_MODE 控制。
- 查当前策略:
grep -E '^(CREATE_HOME|HOME_MODE|SHELL)' /etc/login.defs - 建用户时显式指定更可控:
useradd -m -d "/home/$u" -s "$(getent shells | head -n1)" "$u" - 加
-m确保创建家目录;不加可能只建账号、无目录、无.bashrc,后续sudo或ssh登录失败
批量添加时权限和组关系容易漏掉 usermod 补丁
用 useradd 一次只能指定一个主组(-g),附加组(-G)虽支持,但多个用户不同组配置就得在循环里动态拼接,稍不注意就变成全塞进同一个组,或某用户根本没进任何附加组。
- 常见错误:
useradd -G docker,adm $u—— 如果$u是空变量或含空格,命令直接崩,且不会报错提示 - 安全写法:先
useradd建基础账号,再用usermod -aG docker,adm "$u"追加,-a很关键,否则会覆盖已有附加组 - 如果用户要 sudo 权限,别只改
/etc/sudoers,用usermod -aG sudo "$u"(Debian/Ubuntu)或usermod -aG wheel "$u"(RHEL/CentOS/Fedora)
执行后必须验证 /etc/passwd 和 getent 是否同步
脚本看似成功返回 0,不代表用户真能登录。常见陷阱是:用户写进了 /etc/passwd,但 /etc/shadow 没对应行(密码字段为空或为 !),或 getent passwd $u 查不到——说明 nsswitch 配置或缓存机制干扰了结果。
- 验证命令组合:
getent passwd "$u" && sudo getent shadow "$u" | cut -d: -f2,第二段非空且不为!或*才算密码就位 - 若用
chpasswd批量输密码,输入格式必须严格为user:password,每行一个,末尾不能有空格或\r(Windows 换行易踩坑) - 执行完建议跑一次
pwck和grpck,检查账号数据库语法完整性
实际批量建户最麻烦的从来不是循环本身,而是密码加密方式与目标系统 /etc/login.defs 的隐式耦合,还有 getent 查不到却 cat /etc/passwd 能看到这种“半生效”状态——它往往意味着 NSS 模块没刷缓存,或者用户被 shadow 组策略静默拦截了。











