Linux怎么在Shell脚本中生成指定长度的高强度随机密码

星磊酱_5342

星磊酱_5342

2026-11-07

155人浏览

原创

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

linux怎么在shell脚本中生成指定长度的高强度随机密码

用 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 Security Scanner
Linux Security Scanner

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 给了你强随机源,剩下的得靠脚本里每一步的克制。

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4430

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3713

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

3013

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

7450

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

7082

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

4033

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

3525

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

3759

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

297

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
尚观shell视频教程
尚观shell视频教程

共8课时 | 1.9万人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习