OpenWRT下如何生成随机数?

OpenWRT下如何生成随机数?

使用“正常”(我的意思是完整的)Linux 发行版,它可以正常工作:

sleep $(echo "$[ ($RANDOM % 10 ) ]")

好的,它等待大约0-9秒。

但在 OpenWRT 下 [不是使用bash,而是ash]:

$ sleep $(echo "$[ ($RANDOM % 9 ) ]")
sleep: invalid number '$['
$

以及原因:

$ echo "$[ ($RANDOM % 9 ) ]"
$[ ( % 9 ) ]
$ 

那么有人有办法在 OpenWRT 下生成随机数,以便我可以将其置于“睡眠”状态吗?

答案1

Ash 无法理解$[],因此它在 Bash 中已被弃用。此外,echo没有必要。对于 Bash 和 Ash,请使用以下替代:

sleep $(( $RANDOM % 10 ))

答案2

还请考虑到 OpenWrt 中包含的 Busybox 通常没有编译$RANDOM

如果在编译时选择OpenWrt buildroot 中的BUSYBOX_CUSTOM和配置选项,您就可以拥有它。BUSYBOX_CONFIG_ASH_RANDOM_SUPPORT

否则,您可以使用如下命令:

hexdump -n 2 -e \"%u\" /dev/urandom

这会生成一个介于 0 和 65535 之间的数字。因此,如果您想运行 0-9 秒的睡眠,您可以执行以下操作:

sleep $(($(hexdump -n 2 -e \"%u\" /dev/urandom) % 10))

其中$((... % 10))需要将 0-65535 空间减少到 0-9。

答案3

这是一种生成 0 到 9 之间(含)整数的(不可靠)方法:

sleep $(head -30 /dev/urandom | tr -dc "0123456789" | head -c1)

这会从 读取 30 行/dev/urandom,使用tr丢弃所有非数字字符,然后仅抓取剩余数字的第一个字符。这是不可靠的,因为有可能(可能性非常低)会/dev/urandom产生 30 行恰好包含没有数字

这可以扩展为生成一个三位数(范围为 0-999),如下所示:

$(head -30 /dev/urandom | tr -dc "0123456789" | head -c3)

相关内容