首页 > 技术文章 > shell脚本生成随机数的若干方法总结

shipment 2020-09-09 09:57 原文

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

推荐阅读