简介
在某些情况下,我们需要随机产生一个数来在一些场景中使用,例如验证码、ssh反向代理随机数的产生,又或者在一些shell脚本设计中需要用到随机数,下面以随机产生一个30000-40000之间的随机数为例。
使用shuf
shuf
命令在一些 Linux 系统中是自带的,但并不是所有系统都包含该命令。在 Ubuntu 20.04系统 中,shuf
是默认安装的,因此可以在该系统上使用该命令。如果没有可以手动安装即可。
以下是一些示例用法:
1、生成一个指定范围内的随机数:例如在30000-40000之间随机产生一个数,如下
shuf -i 30000-40000 -n 1
2、从文件中随机选择一行:
shuf file.txt
3、从命令行参数中随机选择一个元素:
shuf -e "apple" "banana" "orange"
4、从文件中随机选择 5 行:
shuf -n 5 file.txt
5、从文件中随机选择行,并将输出重定向到另一个文件:
shuf file.txt -o shuffled.txt
参数介绍
-e, --echo
: 将参数作为输入,并随机打印每个参数。-i, --input-range=LO-HI
: 指定一个范围,以 LO 到 HI 的整数为输入,并随机打印输出。-n, --head-count=COUNT
: 从输入中随机选择 COUNT 个行并打印输出。-r, --repeat
: 允许重复选择行。-z, --zero-terminated
: 使用 null 字符作为行分隔符。-o, --output=FILE
: 将输出重定向到指定文件。
使用 Awk
使用 awk
命令生成随机数:
awk -v min=30000 -v max=40000 'BEGIN{srand(); print int(min+rand()(max-min+1))}'
使用 /dev/urandom
设备生成随机数:
listen_port=$(od -An -N2 -i /dev/urandom | awk -v min=30000 -v max=40000 '{ print ($1 % (max - min + 1)) + min }'
/dev/urandom文件产生随机数据,在熵用尽时不会阻塞。这使得它适用于非加密目的和需要大量随机数的应用。
/dev/random文件使用一种加密安全的算法生成随机数据,这使得它适合用于加密目的。然而,当它耗尽熵(从环境中收集的随机性)时,它就会阻塞,它可能导致程序停止,直到收集到更多的熵。
通过内部系统变量($RANDOM)
echo $RANDOM
生成0-32767之间的整数随机数,若超过5位可以加个固定10位整数,然后进行求余。
产生0到9的随机数可以使用$(($RANDOM%10))取余数,理论上只要a<32767,就可以取0到(a-1)之间的随机数
或者echo ${RANDOM:0:1}下标从0开始长度为1的个位数
生成两位数就是
echo ${RANDOM:0:2}
6-87范围的数:$(($RANDOM%82+6)) #($RANDOM%82可以产生0到81之间的数)
总结
在linux中无论使用那种方法产生的随机均是伪随机数,都不是真正的随机数。在加密或安全敏感的应用中,真正的随机数由物理过程产生,如放射性衰变或热噪声,是首选。