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


Answers:


44
random="$(dd if=/dev/urandom bs=3 count=1)"

1
@Flimzy,如何$()工作?
Linux

2
它将命令的输出视为变量。注意:这是一种bashism。如果您不使用bash,则可能需要使用``。``更通用,但我认为$()更易于阅读。
Flimzy 2011年

@Flimzy ,,It treats the output of a command like a variable.您实际上是指字符串,对吗?
Linux

2
变量可以是字符串...或数字。它将其视为变量...然后根据上下文,将其视为字符串或数字。
Flimzy 2011年

1
$()非常通用,而不是特定于bash。顺便说一句,请注意不要对shell可以存储在变量中的字符施加任何限制-例如,我测试过的bash版本从字符串中省略了null(\ x00)。
Gordon Davisson

44
head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1

(如果要使用文字破折号,则破折号必须像上述那样放在字符串的末尾,而不是*-_)。

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

  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

1
他正在寻找3个字节...
Chris S

1
3加精确模式
ADM

太好了
Danijel-James W

3
大!tr func也有可用的char类名([:graph | print | etc:]),如果最后不需要换行char ,可以通过用fold -w 3 | head -n 1a 代替a 来进一步简化head -c 3
Zimmi 2014年

5
如果系统的默认编码为多字节(例如UTF-8),则tr将失败并显示Illegal byte sequence错误。要解决此问题,请使用“ C”编码;将命令更改为:head -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
devstuff,2015年

33

请检查man od

您可以使用,例如

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

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


1
埃克雷姆,欢迎来到旧金山。我通常不太喜欢长期接受的问题的新答案,但这与以前的所有答案确实不同,并且具有一些真正的优势-太好了!向我+1,希望您能继续留在SF,并在未来一段时间内做出这样的贡献。
MadHatter 2015年

19

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

 cat /dev/urandom | base64 | head -c 5

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

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

cat /dev/urandom | head -c 5 | base64

这与问题的要求不完全相同。您的答案可能仍然有用,但是问题没有足够的上下文可以肯定地说。
kasperd 2015年

1
@kasperd该问题(在标题中)询问如何从/ dev / urandom中读取N个随机字符,但在正文中它要求读取字节。我同意存在不一致之处。我从Google那里读到这个问题是为了阅读字符,我认为这可以帮助将来的访问者作为一种选择。
UmurKontacı15年

我认为您的答案是最简单但最容易理解的。谢谢!
罗伯特

1
使用cat将读取的N字符数远远超过给定数量的字符,并且会耗尽熵。没有用的答案。
Beco博士

1
尽管Beco博士是正确的,cat因为这两者都是一种滥用,base64并且head可以将文件名作为参数,但是在这种情况下,它是可行的,不应消耗熵。参见stackoverflow.com/questions/10031344/…–
J.Money,


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.