如何使用 /dev/(u)random

如何在Ubuntu或任何*nix系统上使用/dev/(u)random
我尝试过了,但是它显示权限被拒绝。 注意:我也尝试以root身份运行。
/dev/(u)random
sudo /dev/(u)random
sudo -s; /dev/(u)random

4请注意,这些命令只应在您真正需要高质量的随机数据时使用,通常用于创建强密码。否则,还有更轻量级的替代方案,例如使用shell环境中的变量RANDOM来生成随机正整数:echo $RANDOM,以及使用程序shuf来生成随机排列,例如按随机顺序播放播放列表中的歌曲。 - sudodus
1你之所以出现错误,是因为你试图执行它而不是阅读它。 - Sam
4个回答

这是一个类似文件的设备,你可以像查看文件一样去操作它或者从中复制内容。例如:
dd if=/dev/urandom of=~/urandom_test count=4 bs=1024

创建一个包含4K随机字节的文件。
cat /dev/urandom > ~/urandom_test2 

将持续向该文件写入随机字节,直到按下Ctrl-C。请勿在性能较低的系统上执行此操作...
head -30 /dev/urandom > ~/urandom_test3

将写入30行随机字节

2请随意点赞! - aychedee
8如果我的声誉值大于15,我会的。 - Caner Korkmaz
2注意:在性能较低的系统上不要执行 cat /dev/urandom > ~/urandom_test2,否则会导致系统冻结。 - Caner Korkmaz
啊,没错。我会修改我的第二个例子。 - aychedee
这30行的长度也是随机的,我猜是吗?(实际上并不是随机字节的行) - Volker Siegel
1嗯...这真的取决于你对行的定义。我的定义是“以\n结尾的字节”。你的定义是什么?运行head -30 /dev/urandom将给你30行随机字节。这些行的长度肯定是随机的。如果你还不相信,试着在输出文件上运行wc -l命令。 - aychedee
3请注意,/dev/urandom 在每次 read() 操作中限制为32 MiB,并且一旦 /dev/urandom 生成了这32 MiB的数据,dd 将不会再尝试读取更多。因此,您需要使用 iflag=fullblock 参数来调用 dd 命令。详见 dd is producing a 32 MB random file instead of 1 GB - Sergiy Kolodyazhnyy

获取随机字节

如果您需要一定数量的随机字节,请从/dev/urandom中读取相应数量的字节。
它是一个“特殊文件”,用于从中读取随机数的文件。

使用cat/dev/urandom中读取是一个不好的主意,因为它会尝试读取/dev/urandom直到结束 - 但它没有结束。

您可以使用head。但要注意按字节读取,而不是按行读取 - 因为行可能会被随机的换行字节分隔开。

因此,要将30个随机字节读入文件random.bytes中,请使用:

head -c 30 /dev/urandom > random.bytes

你可以像普通用户一样阅读它。
别碰 /dev/random
通常情况下,你应该使用 /dev/urandom,而不是 /dev/random。
问题在于正确使用 /dev/random 很困难,而错误使用则很容易。一开始可能没有问题,但后来会出现奇怪甚至是随机的性能问题。有时候。
当你使用 /dev/urandom 时,它内部会使用 /dev/random,并处理其中的棘手部分。

如果您只想以识别出来的数字进行阅读,可以这样做
od -d /dev/random

我认为/dev/urandom更可取。 - Josh Friedlander

我个人使用这个来生成令牌:
dd if=/dev/urandom  count=1 bs=128 | sha512sum