shell实例浅谈之三产生随机数七种方法
一、问题
Shell下有时需要使用随机数,在此总结产生随机数的方法。计算机产生的的只是“伪随机数”,不会产生绝对的随机数(是一种理想随机数)。伪随机数在大量重现时也并不一定保持唯一,但一个好的伪随机产生算法将可以产生一个非常长的不重复的序列。 二、随机数1、生成随机数的七种方法(1)通过内部系统变量($RANDOM) echo $RANDOM 生成0-32767之间的整数随机数,若超过5位可以加个固定10位整数,然后进行求余。 生成400000~500000的随机数: ?
在shell中有一个环境变量RANDOM,它的范围是0--32767 $RANDOM%26 echo$RANDOM%26|bc 13 用这个环境变量对26取模,就可以得到最小是0,最大是25的数了。 $RANDOM%68+1, 前面可以得到最小为0,最大为67的随机数,再加上1,很自然的就可以得到最大为1,最小为68的数了。 $RANDOM%82+6, 前面可以得到最小为0,最大为81的随机数,再加上6,很自然的就可以得到最大为87,最小为6的数了。 等等,其它范围内的数一样可以用这种方法产生,用上面的三个例子,总结出规律来 (2)使用awk的随机函数 awk 'BEGIN{srand();print rand()*1000000}' #可以加上if判断,779644 (3)openssl rand产生随机数 openssl rand 用于产生指定长度个bytes的随机字符。-base64或-hex对随机字符串进行base64编码或用hex格式显示。 openssl rand -base64 8 | md5sum | cut -c1-8 #八位字母和数字的组合,3a61800e openssl rand -base64 8 | cksum | cut -c1-8 #八位数字,10784736 (4)通过时间获得随机数(date) date +%s%N #生成19位数字
?
RANDOM产生的随机数基本在平均值左右浮动(即方差较小)。 (3)批量创建10个系统帐号,密码随机 先看看指定用户密码的脚本: 7 |
#批量创建
个系统帐号并设置密码,帐号和密码相同
name in `seq -w
`
do
#非交互式的输入密码
useradd linux$name && echo
"linux$name"
| passwd --stdin linux$name
done
|
10个用户用户名和密码相同都从linux-01到linux-10,再看看用户密码随机生成的脚本:
?
12 |
个系统帐号并设置密码
rm -f user.log
`
do
#非交互式的输入随机密码
password=`echo $RANDOM | md5sum | cut -c1-
8
`
#可以使用password=`echo
"date $RANDOM"
| md5sum | cut -c3-
11
`
#也可以使用password=`penssl rand -base64
| md5sum | cut -c1-
`
useradd linux$name && echo password | passwd --stdin linux$name
echo -e
"user=linux$name t passwd=$password"
>> user.log #保存用户名密码以查阅
对比可以看出,随机生成密码的灵活性和保密性,管理员可以打开user.log文件,记录刚创建的十个用户的信息。 |