最可靠方法是用 openssl rand -base64 配合 tr 和 cut:openssl rand -base64 16 | tr -d '=+/' | cut -c1-16,它直接读取内核熵池、抗预测、全发行版预装且行为稳定。

用 openssl rand 生成指定长度密码最可靠
Linux 系统自带的 openssl rand 是生成高强度密码的首选,它直接从内核熵池读取随机字节,不依赖伪随机数生成器(PRNG)状态,抗预测性远高于 $RANDOM 或 shuf。默认输出是二进制,需用 -base64 或 -hex 编码成可读字符串。
要生成 16 位密码(含大小写字母、数字、符号),推荐命令:
openssl rand -base64 16 | tr -d '=+/' | cut -c1-16
说明:openssl rand -base64 16 实际生成约 22 字符 Base64 字符串(因编码膨胀),tr -d '=+/' 剔除 Base64 填充符和易混淆字符,cut -c1-16 截取前 16 位——这是兼顾长度可控与字符集安全的常见做法。
- 若需包含更多符号(如
!@#$%),可在截取后用sed替换部分字符,但注意别破坏熵值 - 避免用
head -c16替代cut -c1-16:前者可能截断多字节 UTF-8 字符(虽 Base64 不会出现,但习惯上更稳妥) -
openssl rand -hex 16更短且无符号剔除问题,但只含 0–9 和 a–f,强度略低,适合某些受限场景
为什么不用 pwgen 或 gpg --gen-random
pwgen 默认生成的是「易记密码」,含大量元音拼接和重复模式,不符合「高强度」要求;即使加 -s(secure)参数,其算法仍基于 PRNG,且非所有发行版默认安装。
gpg --gen-random 虽也调用内核熵源,但行为受 GPG 配置影响(比如是否启用 --no-permission-warning),且输出无分隔符时容易和错误流混在一起,脚本中捕获不稳定。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 运行
gpg --gen-random 1 16 | od -An -tx1 | tr -d ' \n'理论可行,但依赖od和tr的行为一致性,在 Alpine 等精简镜像中可能缺失od -
pwgen -syc 16 1输出含换行和空格,需额外清洗,增加出错概率 - 真正需要高强度时,别省那几行代码——
openssl在几乎所有 Linux 发行版(包括 CentOS、Ubuntu、Debian、Alpine)中都预装且行为稳定
在 Shell 脚本里安全使用的关键细节
写进脚本时,不能直接拼接变量到 openssl 命令里——openssl rand 不接受长度作为 shell 变量参数,必须用算术扩展生成字节数。Base64 编码后长度会膨胀约 33%,所以目标密码长度为 n 时,应传入 $(($n * 3 / 4)) 字节,再截取。
一个健壮的函数示例:
genpass() {
local len=${1:-16}
local bytes=$(( (len * 3 + 3) / 4 )) # 向上取整,确保截取够长
openssl rand -base64 $bytes 2>/dev/null | tr -d '=+/' | cut -c1-$len
}
- 必须加
2>/dev/null:某些旧版 OpenSSL 在熵不足时会向 stderr 输出警告,污染 stdout - 用
$(($n * 3 + 3) / 4)而非$((n * 3 / 4)),避免因整除导致截取前字符不足 - 不要用
read或while处理openssl输出:管道会创建子 shell,变量赋值无法回传
别忽略终端显示与存储的安全边界
生成的密码如果直接 echo 到终端,可能被 shell 历史记录、进程列表(ps)或终端复现缓存捕获。生产脚本中应立即用于后续操作(如 usermod、写入密钥文件),而非存为普通变量长期持有。
- 临时变量用
local声明,并在使用后设为空:pass=$(genpass 24); do_something "$pass"; pass= - 避免
echo "$pass"调试;改用printf '%s' "$pass" | wc -c验证长度 - 若需保存到文件,务必设置权限:
umask 077; echo "$pass" > /tmp/pass.$$,用完即rm -f
真正难的不是生成,而是让密码不落地、不残留、不透出——openssl rand 给了你强随机源,剩下的得靠脚本里每一步的克制。










