我需要从一个shell脚本生成一个2000-65000之间的随机端口号。问题是$RANDOM是一个15位的数字,所以我被卡住了!
如果没有大小限制,PORT=$(($RANDOM%63000+2001))将很好地工作。
有没有人有一个例子,我可以这样做,也许从/dev/urandom提取一些东西,并得到它在一个范围内?
我需要从一个shell脚本生成一个2000-65000之间的随机端口号。问题是$RANDOM是一个15位的数字,所以我被卡住了!
如果没有大小限制,PORT=$(($RANDOM%63000+2001))将很好地工作。
有没有人有一个例子,我可以这样做,也许从/dev/urandom提取一些东西,并得到它在一个范围内?
当前回答
我能想到的最简单的方法是perl一行代码:
perl -e 'print int(rand(65000-2000)) + 2000'
你可以用两个数字:
PORT=$(($RANDOM + ($RANDOM % 2) * 32768))
你还是得在你的范围内。这不是一般的n位随机数方法,但它适用于您的情况,并且都在bash中。
如果你想非常可爱地阅读/dev/urandom,你可以这样做:
od -A n -N 2 -t u2 /dev/urandom
它会读取两个字节,并将它们作为unsigned int输出;你还是得剪。
其他回答
在Mac OS X和FreeBSD上,你也可以使用jot:
jot -r 1 2000 65000
在Bash中从10000000000 -999999999999范围内生成50个数字,并将它们保存到文件filename.csv中
shuf -i 100000000000-999999999999 -n 50 -o filename.csv
或在OS-X以下工作为我:
$ gsort --random-sort
生成范围为[$floor,$ceil]的随机数,不依赖:
$(((RANDOM % $(($ceil- $floor))) + $floor))
在2000到65000之间生成100个数字:
for i in $(seq 100); do echo $(((RANDOM % $((65000 - 2000))) + 2000));done
如果你需要大于15位的范围,不要使用慢的不安全的过时的15位RANDOM,使用快速安全的32位SRANDOM。
SRANDOM自2021年bash 5.1推出以来可用。
Bash 5.1中值得注意的一个有趣的添加是新的SRANDOM变量。SRANDOM变量提供来自系统熵引擎的随机数据,不能被重新播种。特别是,SRANDOM变量提供了一个32位随机数,它依赖于getrandom/getentropy——如果必要的话,还可以回退到/dev/urandom或arc4random,甚至在此之后的另一个回退。”
来源:https://www.phoronix.com/news/gnu - bash - 5.1
看看bash中的RANDOM和SRANDOM有什么不同:
Bash中RANDOM和SRANDOM的区别
请随意改进这个答案。