shell脚本⽣成随机数的若⼲⽅法总结
shell脚本⽣成随机数的若⼲⽅法总结
⽬录
创建账户时我们需要配置初始随机密码,使⽤⼿机注册时会需要随机的验证码,再如俄罗斯⽅块需要随机出形状。这都说明随机数据很重要,让我们来看看shell脚本中随机数的⽣成⽅法的⼀些案例
1.使⽤字符串截取的⽅式⽣成随机密码
#!/bin/bash
#功能描述(Description):使⽤字串截取的⽅式⽣成随机密码.
#定义变量:10个数字+52个字符.
key="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
randpass(){
if [ -z "$1" ];then
echo "randpass函数需要⼀个参数,⽤来指定提取的随机数个数."
return 127
fi
#调⽤$1参数,循环提取任意个数据字符.
#⽤随机数对62取余数,返回的结果为[0-61].
pass=""
for i in `seq $1`
do
num=$[RANDOM%${#key}]
local tmp=${key:num:1}
pass=${pass}${tmp}
done
echo $pass
}
#randpass 8  取8个字符
#randpass 16
#echo $(randpass 6)  从key中随机取6个字符输出
#创建临时测试账户,为账户配置随机密码,并将密码保存⾄/tmp/pass.log.
useradd tomcat
passwd=$(randpass 6)
echo $passwd | passwd --stdin tomcat
echo $passwd > /tmp/pass.log
2.使⽤命令⽣成随机数
uuid的⽣成⽅法
[root@localhost ~]# uuidgen
cc3652e3-7e54-498b-a4e3-6ff746f5cc73
[root@localhost ~]# uuidgen
6f5d5581-f4b4-4443-8cb3-37ad11b97d52
shell最简单脚本
[root@localhost ~]# uuidgen
fc48a818-d323-48f1-b975-86e8f6d9046a
openssl命令来⽣成
⽣成16进制的随机字符串
[root@localhost ~]# openssl rand -hex 1
8e
[root@localhost ~]# openssl rand -hex 2
eeb6
[root@localhost ~]# openssl rand -hex 3
2aefbb
[root@localhost ~]# openssl rand -hex 4
78706e3a
[root@localhost ~]# openssl rand -hex 5
0dfdd2bbbc
[root@localhost ~]# openssl rand -hex 6
e7a550493377
⽣成含有特殊符号的随机字符串
[root@localhost ~]# openssl rand -base64 1
eQ==
[root@localhost ~]# openssl rand -base64 6
PdOc8SXT
[root@localhost ~]# openssl rand -base64 10
mHDkK/mEgITaVA==
使⽤base64算法⽣成的随机数据,其最终的长度为(n/3)向上取整后在乘以4.
如(1/3)=0.333333 ,向上取整为1,base64编码后长度为1×4=4位
如(6/3)=2 ,向上取整为2,base64编码后长度为2×4=8位
如(10/3)=3.333333 ,向上取整为4,base64编码后长度为4×4=16位
[root@localhost ~]# date +%s #通过时间提取随机数字
1588802225
[root@localhost ~]# date +%s #1970-1-1到现在的秒数
1588802231
[root@localhost ~]# date +%s%N #1970-1-1到现在的纳秒数
1588802237373838045
#对明⽂加密⽣成随机字符串
[root@localhost ~]# echo abc | openssl passwd -stdin
89n8souuGpQS6
[root@localhost ~]# echo 1234 | openssl passwd -stdin
Mhm/mQIxCm5nE
#对密⽂⽤⼀段杂字⽣成随机字符串
openssl passwd -1 -salt string        //string⼀般为8位
[root@localhost ~]# openssl passwd -1 -salt hellotom
Password:
$1$hellotom$5j6sZNiOfuQiZuz421aFS.
3.使⽤设备⽂件来⽣成
在linux操作系统中默认提供了两个可以⽣成随机数的设备⽂件:/dev/random/dev/urandom。很多程序都会调⽤这些设备⽣成随机数据,如SSH、GPG、Tomcat。dev/random依赖于系统中断(Interrupt),因此当系统中断不⾜时,该⽂件是⽆法提供⾜够的随机数据,这样会导致需要使⽤random⽣成随机数据的程序阻塞。⽽/dev/urandom则不依赖于系统中断,在系统中断不⾜时也能提供⾜够的随机数据。我们可以⽤⽂本⼯具直接查看这两个⽂件,因为这两个⽂件可以提供⽆限的随机数据,所以需要使⽤Ctrl+c来中断查看。
[root@localhost ~]# cat /dev/random
"pHpA8瑀mTd09b
®Ɍ«>c BxXshell  ¡˩)¼kԵd ¹頳ıd te4 ¬㐞n ײ´  *-a
......
#ctrl+c结束
/dev/random 和 /dev/urandom 存储的都是乱码,实际上它们是通过⼆进制数据保存实时数据的
打开/dev/random和/dev/urandom⽂件,推荐⽤ head,不推荐 cat 命令,因为⽂件⾮常⼤且是乱码,只需要获取前⼏⾏⽂件内容就变了
⽤到了 cksum 命令,其读取⽂件内容,⽣成的整型数据的校验码字节数,如2047486136是校验码,4992是字节数。只有⽂件内容没变,⽣成结果就不会变化,⽤来校验⽂件是否篡改。
[root@localhost ~]# head -20 /dev/urandom | cksum
2047486136 4992
[root@localhost ~]# head -20 /dev/urandom | cksum
2101994601 6214
[root@localhost ~]# head -20 /dev/urandom | cksum
1248638338 6101
#以空格为分隔符,显⽰第⼀段的内容
[root@localhost ~]# head -20 /dev/urandom | cksum | cut -f1 -d" "
2140611235
[root@localhost ~]# head -20 /dev/urandom | cksum | cut -f1 -d" "
2367045903
[root@localhost ~]# head -20 /dev/urandom | cksum | cut -f1 -d" "
3940195132
/dev/random和/dev/urandom可能包含特殊符号,所以我们需要使⽤tr过滤,也有可能需要指定位数的数据,因此还需要⼯具来截取特定长度的随机数。
tr常⽤的选项
选项功能描述
-s删除连续的多个重复数据
-d删除包含特定集合的数据
-c使⽤数据集1的差集(取反)
语法格式如下:
tr [选项] 数据集1 [数据集2]
数据集1是必须的,选项和数据集2可选
#从标准输⼊读取数据
[root@localhost ~]# tr -cd '0-9' <  /dev/urandom | head -c 10
6603749217
[root@localhost ~]# tr -cd 'a-z' <  /dev/urandom | head -c 10
vxaavkdxpo
[root@localhost ~]# tr -cd 'A-Z' <  /dev/urandom | head -c 10
ESABSBQOTT
[root@localhost ~]# tr -cd '_a-zA-Z0-9' <  /dev/urandom | head -c 10
ol_YHk6Uy4
4.使⽤系统变量⽣成随机数
系统变量 $RANDOM
[root@localhost ~]# echo $RANDOM
6414
[root@localhost ~]# echo $RANDOM
4323
[root@localhost ~]# echo $RANDOM
23170
$RANDOM 的范围是 [0, 32767]
可以在⽣成随机数后在⽤md5sum等⽅式⽣成字符串,最后截取⼀段
[root@localhost ~]# echo $RANDOM | md5sum
2f92858ba750b37023e41dc3951ea80e  -
[root@localhost ~]# echo $RANDOM | md5sum | cut -c 1-10
cb55d56894
[root@localhost ~]# echo $RANDOM | openssl dgst -md5
(stdin)= dfa1638aaef57df194d2ec5e1e2a47c5
[root@localhost ~]# echo $RANDOM | openssl dgst -md5 |cut -c 10-20
84c52980ad4
5.通过Hash值⽣成随机数据
Hash 可以把任意长度的输⼊数据通过散列算法变换成固定的长度输出,输出值也叫散列值。Linux系统⾃带很多散列算法的⼯具,例如
md5sum、sha1sum、sha256sum、sha512sum等,通过这些⼯具可以⽣成随机数据。需要注意的是,这种⽅法提取的随机数据都是⼗六进制数,也就是随机数的范围是0-9A-F。
[root@localhost ~]# echo "hello world" | md5sum
6f5902ac237024bdd0c176cb93063dc4  -
[root@localhost ~]# echo "hello world" | md5sum | cut -d' ' -f1
6f5902ac237024bdd0c176cb93063dc4
[root@localhost ~]# echo "hello world" | sha256sum | cut -d' ' -f1
a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447
[root@localhost ~]# md5sum /etc/passwd | cut -d' ' -f1
279e2c2afcf43cb4d836536f5acd981f
[root@localhost ~]# sha256sum /etc/passwd | cut -d' ' -f1
f77fd317fa5be9556c5b984ad1b6c4b13c1466beb2621133e7e26361a6cb7232
#删除⾮数字的
[root@localhost ~]# sha256sum /etc/passwd | cut -d' ' -f1 | tr -cd '0-9'
77317595565984164131466262113372636167232
#删除⾮⼩写字母
[root@localhost ~]# sha256sum /etc/passwd | cut -d' ' -f1 | tr -cd 'a-z'
ffdfabecbadbcbcbebeeacb
#⼩写替换成⼤写
[root@localhost ~]# sha256sum /etc/passwd | cut -d' ' -f1 | tr  'a-z' 'A-Z'
F77FD317FA5BE9556C5B984AD1B6C4B13C1466BEB2621133E7E26361A6CB7232

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。