批量创建linux用户需用while read -r逐行读取用户名文件,用chpasswd设密码,先用id检测用户是否存在再创建,并显式指定-m、-s、-u等参数确保跨系统稳定。

批量创建 Linux 用户不是靠重复敲命令,而是靠脚本把“读一行、建一个、设密码”变成自动流水线。关键不在功能多,而在稳——不因空格、重名或权限报错中断,也不把密码明文留在历史里。
用户名文件必须按行组织,别用空格分隔
很多人把用户名写成一行:alice bob charlie,再用for user in $(cat users.txt)读取。一旦用户名含空格(比如“zhang san”)或特殊字符,就会被拆成两个错误用户。正确做法是每行一个名字:
- 准备纯文本文件
users.txt,内容如下:
alice
bob
charlie
- 用
while read -r name逐行读取,不依赖空白符切分: while read -r name; do useradd -m -s /bin/bash "$name"; done
密码设置必须绕过交互限制
passwd命令默认只认终端输入,管道传密码会失败(报错Authentication token manipulation error)。不能用echo "pwd" | passwd username,得换可靠方式:
- 推荐
chpasswd:格式为user:password,冒号不能漏 echo "alice:MyPass123" | chpasswd- CentOS/RHEL 可用
passwd --stdin,但 Ubuntu/Debian 不支持,脚本跨系统时优先选chpasswd
建用户前先检查是否存在,避免报错中断
直接useradd alice遇到已存在用户会报错并退出(尤其开启set -e时)。应主动判断:
- 用
id username &>/dev/null检测用户是否存在 - 存在则跳过创建,仅更新密码;不存在才执行
useradd - 示例逻辑:
if id "$name" &>/dev/null; then
echo "$name 已存在,仅更新密码"
echo "$name:NewPass123" | chpasswd
else
useradd -m -s /bin/bash "$name"
echo "$name:NewPass123" | chpasswd
fi
加参数要统一,别依赖系统默认
不同发行版的/etc/default/useradd配置可能不同。批量时务必显式指定关键选项:
-
-m:强制创建家目录(即使默认关了也生效) -
-s /bin/bash:明确登录 shell,避免默认为/bin/sh导致环境异常 -
-U:为每个用户自动建同名私有组,避免多人共用users组引发权限混乱 - 不要省略这些参数,哪怕你刚用
useradd -D查过默认值











