最稳妥的批量创建用户并设密码方法是useradd配合openssl rand生成密码后用chpasswd设置,不依赖--stdin(debian/ubuntu不支持)、避免明文密码泄露风险,且兼容所有主流linux发行版。

直接用 useradd 配合 openssl rand 生成密码是最稳妥的做法,不依赖外部工具、不暴露明文密码、兼容所有主流 Linux 发行版(RHEL/CentOS/Debian/Ubuntu)。
为什么不能用 passwd --stdin 批量设密码
这个选项在 RHEL/CentOS 上默认可用,但 Debian/Ubuntu 的 passwd 命令压根不支持 --stdin,强行使用会报错 passwd: unrecognized option '--stdin'。更关键的是,它要求密码以明文形式传入标准输入,在脚本中极易被 ps 或进程审计捕获,存在安全风险。
用 useradd + openssl rand 生成并设置密码
核心思路是:先用 useradd 创建用户(不设密码),再用 chpasswd 批量写入加密后的密码。注意,chpasswd 默认接受明文密码,但它会自动调用系统 crypt 函数加密,无需手动处理 salt。
-
openssl rand -base64 12生成 12 字符随机字符串(含大小写字母、数字、+ /),足够安全且无特殊字符兼容问题 - 密码必须通过
chpasswd输入,不能用usermod -p直接写入加密串——因为不同系统 crypt 实现可能不同,硬编码 hash 容易导致登录失败 - 示例脚本片段:
#!/bin/bash while IFS= read -r username; do [[ -z "$username" ]] && continue password=$(openssl rand -base64 12 | tr -d '\n') echo "$username:$password" | chpasswd echo "User $username created, password: $password" done
批量创建前必须检查的三件事
跳过这些检查,脚本跑一半会卡住或静默失败:
- 确认
/etc/skel中的默认配置(如.bashrc)是否符合预期,否则新用户家目录初始化异常 - 检查磁盘配额和用户数量限制:
cat /proc/sys/kernel/threads-max和ulimit -u,避免超出系统最大进程/用户数 - 确保
userlist.txt每行一个用户名,不含空格、下划线开头、点号结尾等非法字符(useradd会拒绝创建)
真正麻烦的不是生成密码,而是密码分发——别把明文密码直接 echo 到终端或日志;生产环境应结合 ssh-copy-id 或密码管理器 API 自动同步,而不是靠脚本打印出来。











