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
[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瑀mTd0묨9b
®Ɍ«>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

posted @ 2020-09-09 09:57  EverEternity  阅读(2988)  评论(0编辑  收藏  举报