Linux / UNIX 使用 /dev/urandom 生成密码
如何在 Linux / UNIX / macOS (OS X) 和 *BSD 操作系统下生成随机密码?
在 Linux 或类 Unix 系统上,读取时 /dev/random 或 /dev/urandom 设备会返回无限量的随机字节。在 FreeBSD 上,/dev/urandom 是指向 /dev/random 的符号链接。换句话说,可以使用 /dev/urandom 设备通过从熵池中获取的伪随机数生成器来获取随机字节。然后借助tr 命令和 xargs 命令过滤掉某些垃圾并获取可用的密码。本快速提示介绍了如何在 Linux 或 Unix shell 上使用 /dev/urandom 生成密码。
在 Linux 或类 Unix 系统上,读取时 /dev/random 或 /dev/urandom 设备会返回无限量的随机字节。在 FreeBSD 上,/dev/urandom 是指向 /dev/random 的符号链接。换句话说,可以使用 /dev/urandom 设备通过从熵池中获取的伪随机数生成器来获取随机字节。然后借助tr 命令和 xargs 命令过滤掉某些垃圾并获取可用的密码。本快速提示介绍了如何在 Linux 或 Unix shell 上使用 /dev/urandom 生成密码。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | Linux 或 Unix 终端 |
类别 | 命令 |
操作系统兼容性 | BSD • Linux • macOS • Unix |
预计阅读时间 | 2 分钟 |
使用 /dev/urandom 文件和命令生成密码
您可以使用以下命令在 Linux 或 Unix 机器(包括 macOS)上生成随机密码。语法是:
tr -dc A-Za-z0-9_ < /dev/urandom | head -c 16 | xargs
示例输出:
1z2G4SVmZOdd4uK4
您可以按如下方式创建 bash shell 函数(添加到您的 ~/.bashrc):
genpasswd() { local l=$1 [ "$l" == "" ] && l=16 tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs }
现在使用 genpasswd 如下创建 8 个字符长的密码:
genpasswd 8
示例输出:
Es5Yzf8H
如何处理“tr: 非法字节序列”消息
您可能会收到如下错误或消息:
tr: Illegal byte sequence
要在 macOS、FreeBSD 和其他类 Unix 系统上修复此问题,请将语言环境设置为 C。例如:
LC_ALL=C tr -dc A-Za-z0-9_ < /dev/urandom | head -c 16 | xargs
或者在使用bash/sh时使用export命令:
LC_ALL=C export LC_ALL tr -dc A-Za-z0-9_ < /dev/urandom | head -c 16 | xargs
在我的情况下,语言环境的 charmap 默认设置为 UTF-8,因此屏幕上会出现这样的消息。使用 locale 命令获取 Linux、Unix、macOS 和类 Unix 系统上的语言环境特定信息。例如:
$ locale
这是我看到的:
LANG=C.UTF-8 LC_CTYPE="C.UTF-8" LC_COLLATE="C.UTF-8" LC_TIME="C.UTF-8" LC_NUMERIC="C.UTF-8" LC_MONETARY="C.UTF-8" LC_MESSAGES="C.UTF-8" LC_ALL=
总结
我希望这个快速提示能帮助您使用 Linux 或 Unix CLI 生成随机密码。我强烈建议使用密码管理器对所有带有 2FA 的密码进行设置。想要了解有关 /dev/random 或 /dev/urandom 文件的更多信息?使用 man 命令:
$ man 4 random
$ man locale
$ man tr
$ man xargs