chpasswd 是 passwd 的非交互版本:passwd 要人手敲两次确认,chpasswd 从标准输入读 用户名:密码 直接改完。它是批量建用户/改密码场景的核心工具。
1.基本用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| chpasswd [选项] < 用户密码文件
echo "gaga:Passw0rd123" | chpasswd sudo -u gaga ls /home
cat users.txt
chpasswd < users.txt
|
输入格式规则:
每行: 用户名:密码
• 密码是明文 —— chpasswd 内部会过 PAM/shadow 加密(gcrypt/md5 取决于系统配置)
• 用户名不存在 → 报错跳过该用户(不影响其他行)
• 密码含冒号 → 用双引号包裹或改用其他写法(极少见, 一般避开)
• 行尾不要有多余空格
2.常用选项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 选项 作用 ─────────── ───────────────────────────────────── -e ★加密输入: 输入行改成 用户名:加密密码:哈希算法长度 格式: user:$6$salt$hash (或 -h 查看支持算法) 直接把算好的哈希喂进去, 明文不落盘
-h 查看哈希算法(默认 crypt 或 yescrypt 因发行版而异) CentOS7: $6$; Ubuntu20.04: $y$; Ubuntu24.04: $y$
-R <chroot> 在 chroot 环境里改(离线修系统, 如安装器/救援模式) 配合 rescue 模式给"装坏的"系统重置 root 密码: chpasswd -R /mnt/sysroot
-f, --force 忽略错误强制继续(谨慎用)
--quiet 安静模式, 只保留错误输出(脚本里用)
|
结合 -e 把明文挡在外面(较安全的批量方案):
1 2 3 4 5 6 7 8 9 10
| python3 -c "import crypt; print(crypt.crypt('Al1ce@2024', '\$y\$' + 'salthere'))"
cat users.enc
chpasswd -e < users.enc
|
3.批量创建用户
chpasswd 本身不建用户(只改已存在用户的密码),所以批量开户是 useradd + chpasswd 组合:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
hash() { python3 -c "import crypt,sys; print(crypt.crypt(sys.argv[1], crypt.mksalt(crypt.CRYPT_YESCRYPT)) if sys.argv[1] else '')" "$1" }
gen_hash() { openssl passwd -6 -salt "somesalt" "$1" }
while IFS=, read -r user group uid; do useradd -m -g "$group" -u "$uid" "$user" done < dev_users.csv
while IFS=, read -r user group uid; do echo "${user}:Dev@Init${uid}" done < dev_users.csv | chpasswd
|
更优雅的写法(一条命令,推荐):
1 2 3 4 5 6
| echo "gaga1:$(openssl passwd -6 -salt s1 'Dev@1234') gaga2:$(openssl passwd -6 -salt s2 'Dev@5678')" | chpasswd
useradd -m -g dev -u 1001 gaga1 -p "$(openssl passwd -6 'Dev@1234')"
|
4.密码策略相关
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| passwd -e alice
chage -E 2026-01-01 alice chage -d 0 alice
passwd -L alice passwd -U alice usermod -L alice usermod -U alice
chage -l alice
for u in dev1 dev2 dev3; do chage -M 90 "$u"; done
usermod -e 2026-12-31 dev1 dev2
|
5.维护常用命令
需求 用什么
────────────────────────── ─────────────────────────────────────
手工改单个用户密码(交互) passwd
脚本/批量改密码(非交互) chpasswd ← 本主题
建用户+设密码一步到位 useradd -p "$(openssl passwd -6 ...)"
锁定/解锁用户 passwd -L/-U 或 usermod -L/-U
过期策略(90天) chage -M 90 / usermod -e
root 密码忘了(救援模式) 单用户模式(重启进recovery) 或 chpasswd -R
批量从CSV建用户 useradd + chpasswd 组合脚本
Kerberos/AD 域用户 kpasswd / ldap(不在本机chpasswd管辖范围)