批量创建 Linux 用户并设置SHA-512加密密码

#!/bin/bash
# 定义要创建的用户名和明文密码
USER_NAME="testuser"
RAW_PWD="xansun"

# 生成 SHA-512 加密密码(核心命令)
ENCRYPTED_PWD=$(echo "$RAW_PWD" | openssl passwd -6 -salt $(< /dev/urandom tr -dc '[:alnum:]' | head -c 16) -stdin)

# 创建用户并设置加密密码(无需交互)
if ! id "$USER_NAME" &>/dev/null; then
    useradd -m -p "$ENCRYPTED_PWD" "$USER_NAME"
    echo "用户 $USER_NAME 创建成功,密码:$RAW_PWD(加密后:$ENCRYPTED_PWD)"
else
    echo "用户 $USER_NAME 已存在"
fi

核心命令:

echo "xansun" | openssl passwd -6 -salt $(< /dev/urandom tr -dc '[:alnum:]' | head -c 16) -stdin

命令段作用详细说明

echo "xansun"输出明文密码提供需要加密的原始密码 xansun,通过管道传递给后续命令“管道符将前一个命令的输出作为后一个命令的输入

openssl passwdOpenSSL 密码加密工具核心工具,用于生成加密的密码哈希值

-6关键参数:使用 SHA-512 算法(Linux 系统默认 / 推荐的密码加密算法,对应 /etc/shadow 中密码开头的 $6$),安全性远高于 MD5(-1

-salt $(...)指定盐值(随机生成)盐值是加密时的随机字符串,用于防止彩虹表破解,这里自动生成 32 位字母数字混合的盐值

< /dev/urandom读取系统随机数设备/dev/urandom 是 Linux 系统的加密安全随机数生成器,比 /dev/random 更快且不阻塞

tr -dc '[:alnum:]'过滤非字母数字字符-d 删除指定字符,-c 取反,即只保留字母(a-z/A-Z)和数字(0-9)

head -c 16生成 16 位盐值(SHA-512 支持 1-16 位盐值,16 位是最优长度)

-stdin从标准输入读取明文密码从管道读取 echo "xansun" 的输出作为明文密码,而非命令行参数(更安全)

执行命令后,会输出类似这样的加密字符串,每次执行输出都不同(盐值随机),但都对应明文 xansun,典型输出格式:

Categories: 系统运维