如何从 /dev/urandom 中读取 N 个随机字符?

lin*_*nux 66 bash random-number-generator

read /dev/urandom 3
Run Code Online (Sandbox Code Playgroud)

以上不起作用..如何从/dev/urandombash中读取随机字节?

小智 61

head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
Run Code Online (Sandbox Code Playgroud)

(如果您想要文字破折号字符,破折号字符必须按上述方式放在字符串的末尾,而不是*-_)。

并解释由于上述命令集而完成的工作:

  1. head -c 500 /dev/urandom: 获取前 500 个字符(字节)/dev/urandom
  2. tr -dc 'a-zA-Z0-9~!@#$%^&*_-':从第一个命令的输出中删除除 中指定的字符以外的所有字符'a-zA-Z0-9~!@#$%^&*_-'
  3. fold -w 3:格式化第二个命令的输出,使其每行包含 3 个字符。
  4. head -n 1: 显示第三条命令结果的第一行stdout

  • 如果系统的默认编码是多字节(例如 UTF-8),则 tr 将失败并显示“非法字节序列”错误。要解决这个问题,请使用“C”编码;将命令更改为:`head -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | 折叠 -w 3 | 头-n 1` (6认同)
  • 伟大的!还有可用于 tr 函数的字符类名称 ([:graph|print|etc:]),可以通过替换 `fold -w 3 | 来进一步简化它。如果最后不需要换行符, head -n 1` 加上 `head -c 3`。 (4认同)
  • 开头抓取500个字节的目的是什么?难道你没有得到相同的结果:`cat /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | 折叠 -w 3 | 头-n 1` (2认同)

Fli*_*mzy 53

random="$(dd if=/dev/urandom bs=3 count=1)"
Run Code Online (Sandbox Code Playgroud)

  • 它将命令的输出视为变量。注意:这是一种bashism。如果您不使用 bash,则可能需要使用 `` 代替。`` 更通用,但我认为 $()​​ 更容易阅读。 (2认同)
  • 变量 _can_ 是一个字符串...或一个数字。它把它当作一个变量……然后根据上下文,它被当作一个字符串或一个数字。 (2认同)

小智 42

请检查man od

例如,您可以使用

od -vAn -N4 -tu4 < /dev/urandom

生成无符号十进制 4 字节随机数。

  • 埃克雷姆,欢迎来到旧金山。我通常不太喜欢长期接受的问题的新答案,但这确实与以前的所有答案不同,并且有一些真正的优势 - 很好!我的+1,我希望你留在旧金山并在未来一段时间内做出这样的贡献。 (2认同)

Umu*_*acı 26

这是创建 base64 字符串的一个,请注意,尽管它们仅限于 base64 字符串,但填充已从它们中删除,因此您无法对其进行解码,无论如何您可能都不需要它。

 cat /dev/urandom | base64 | head -c 5
Run Code Online (Sandbox Code Playgroud)

替换5为您想要的字符数。

但是,如果您出于某种原因需要对它们进行解码,请移至base64管道的末端。然后它将从 urandom 收集 5 个字符,并使用正确的填充对其进行 base64 编码,但由于填充,最终字符串可能比您想要的长。

cat /dev/urandom | head -c 5 | base64
Run Code Online (Sandbox Code Playgroud)

  • @kasperd 问题问(在标题中)如何从 /dev/urandom 读取 N 个随机字符,但在正文中它要求读取字节。我同意存在不一致之处。我从谷歌来到这个问题是为了阅读字符,我认为它可以作为一种选择对未来的访问者有所帮助。 (2认同)
  • 嘿!这是 cat 的另一种无用用法。```$ head -c 5 /dev/urandom | base64``` 产生完全相同的输出。 (2认同)

Edu*_*nec 11

尝试这个: dd if=/dev/urandom bs=1 count=3

如果你想把结果放在 $variable 中:

variable=`dd if=/dev/urandom bs=1 count=3`
Run Code Online (Sandbox Code Playgroud)

请注意,它可能无法打印。


Spa*_*ack 11

最简单的解决方案很简单:

$ head -cN /dev/urandom
Run Code Online (Sandbox Code Playgroud)

  • 更简单的调用 (7认同)
  • 这对已经给出的答案有什么补充? (2认同)