我需要从一个shell脚本生成一个2000-65000之间的随机端口号。问题是$RANDOM是一个15位的数字,所以我被卡住了!
如果没有大小限制,PORT=$(($RANDOM%63000+2001))将很好地工作。
有没有人有一个例子,我可以这样做,也许从/dev/urandom提取一些东西,并得到它在一个范围内?
我需要从一个shell脚本生成一个2000-65000之间的随机端口号。问题是$RANDOM是一个15位的数字,所以我被卡住了!
如果没有大小限制,PORT=$(($RANDOM%63000+2001))将很好地工作。
有没有人有一个例子,我可以这样做,也许从/dev/urandom提取一些东西,并得到它在一个范围内?
当前回答
在Bash中从10000000000 -999999999999范围内生成50个数字,并将它们保存到文件filename.csv中
shuf -i 100000000000-999999999999 -n 50 -o filename.csv
其他回答
在Bash中从10000000000 -999999999999范围内生成50个数字,并将它们保存到文件filename.csv中
shuf -i 100000000000-999999999999 -n 50 -o filename.csv
这就是我通常生成随机数的方法。然后我使用“NUM_1”作为我使用的端口号的变量。下面是一个简短的示例脚本。
#!/bin/bash
clear
echo 'Choose how many digits you want for port# (1-5)'
read PORT
NUM_1="$(tr -dc '0-9' </dev/urandom | head -c $PORT)"
echo "$NUM_1"
if [ "$PORT" -gt "5" ]
then
clear
echo -e "\x1b[31m Choose a number between 1 and 5! \x1b[0m"
sleep 3
clear
exit 0
fi
如果你需要大于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的区别
请随意改进这个答案。
你可以通过urandom得到随机数
Head -200 /dev/urandom | cksum
输出:
3310670062 52870
检索上述数字的一部分。
Head -200 /dev/urandom | cksum | cut -f1 -d " "
那么输出是
3310670062
为了满足您的要求,
Head -200 /dev/urandom |cksum | cut -f1 -d " " | awk '{print $1%63000+2001}'
你可以这样做
cat /dev/urandom|od -N2 -An -i|awk -v f=2000 -v r=65000 '{printf "%i\n", f + r * $1 / 65536}'
如果需要更多详细信息,请参阅Shell脚本随机数生成器。