chpasswd 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
chpasswd——用户与权限管理命令族(见用户与权限命令速查)。要给一批新机器初始化账号密码,它比逐个 passwd 交互输密码高效得多。
chpasswd 从标准输入读取 用户名:密码 格式的行,批量更新这些用户的密码。它专为非交互、批量场景设计。
一、基本用法
bash
echo "alice:NewPass123" | chpasswd # 给单个用户改密(管道喂入)
chpasswd < users.txt # 从文件批量改(文件每行 用户名:密码)核心格式就是
用户名:明文密码,从 stdin 读。比 passwd 需要交互两次、且每条都要单独跑,chpasswd 一条命令搞定一批,是自动化初始化/装机脚本的标配。
二、指定加密算法
bash
chpasswd -e < users.txt # -e 表示输入的是已加密的密码哈希(不是明文)
chpasswd -c SHA512 < users.txt # -c 指定加密方法(SHA512 等)默认 chpasswd 把明文密码用系统默认算法(通常 sha512)加密后写入
/etc/shadow。-e用于你已经算好哈希、只想直接写入的场景;-c指定算法。绝大多数情况用默认即可,加密细节交给系统。
三、chpasswd vs passwd
| 命令 | 交互性 | 适用 |
|---|---|---|
| passwd | 交互(需输两次/旧密码) | 人工改自己或他人密码(见passwd 命令详解) |
chpasswd | 非交互,从 stdin 读 | 脚本批量初始化 |
人手工改密码用 passwd(会校验旧密码、要求确认);脚本批量设密码用
chpasswd(管道/文件喂入,无交互)。两者最终都改/etc/shadow。
四、踩坑:明文密码进历史/进程列表
bash
# 危险写法:密码明文出现在命令行,会被 ps/历史记录捕获
echo "alice:Pass123" | chpasswd
# 更稳妥:从受权限保护的文件或 heredoc 读取,避免明文命令行
chpasswd < /secure/users.txt # 文件权限设为 600chpasswd 本身不从命令行读密码(从 stdin),但如果你用
echo "用户:密码"这种形式,密码会进 shell 历史、也可能被 ps 短暂看到。正确做法是把凭据放权限受限的文件里再重定向喂入。
五、实战:装机脚本初始化账号
bash
cat > /tmp/init_users.txt <<'EOF'
deploy:DeployPass!2026
reader:ReaderPass!2026
EOF
chmod 600 /tmp/init_users.txt
chpasswd < /tmp/init_users.txt
rm -f /tmp/init_users.txt一句话总结
chpasswd = 批量设密码(非交互):从 stdin 读 用户名:密码,管道或文件喂入,适合装机/初始化脚本;-e 接已加密哈希、-c 指定算法。注意别把明文密码写进命令行(会进历史)——放 600 权限文件再重定向。人工改密用 passwd。