Shell脚本实战01-批量生成随机字符文件名

1. 批量生成随机字符文件名

使用for循环在/root目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串theshu。

1.1. 问题分析

第一个知识点就是for循环的使用。第二个知识点就是生成10个随机小写字母,产生随机数的方法见下面的总结。这里采取openssl命令的方法来实现,操作结果如下:

1
2
3
4
5
6
7
8
[root@AmingLinux-107 shell]# openssl rand -base64 40 #<==生成40位随机数
cd5hTHE/8J6Qnupe/aqxENkjKHMoDZ2eHeIKnPJuabSYRl8MlEsaYA==
[root@AmingLinux-107 shell]# openssl rand -base64 40 | sed 's#[^a-z]##g'
#<==利用sed替换掉非小写字符
fepubzlvpylerecfmthwjw
[root@AmingLinux-107 shell]# openssl rand -base64 40 | sed 's#[^a-z]##g' | cut -c 2-11
#<==利用cut取10位
irhdzwzycb

1.2. 参考答案

1
2
3
4
5
6
7
8
#!/bin/bash
Path=/root
[ -d "$Path" ] || mkdir -p $Path
for n in `seq 10`
do
random=$(openssl rand -base64 40 | sed 's#[^a-z]##g' | cut -c 2-11)
touch $Path/${random}_theshu.html
done

1.3. 执行结果

1
2
3
4
5
6
7
8
9
10
11
[root@theshu shell]# ll /root
-rw-r--r-- 1 root root 0 3月 5 10:42 apjgfskqhf_theshu.html
-rw-r--r-- 1 root root 0 3月 5 10:42 bwrzszktlg_theshu.html
-rw-r--r-- 1 root root 0 3月 5 10:42 dmtmguxncz_theshu.html
-rw-r--r-- 1 root root 0 3月 5 10:42 dnsxbazfqa_theshu.html
-rw-r--r-- 1 root root 0 3月 5 10:42 ecjeopdntb_theshu.html
-rw-r--r-- 1 root root 0 3月 5 10:42 glpvylszpu_theshu.html
-rw-r--r-- 1 root root 0 3月 5 10:42 otyiatwrnd_theshu.html
-rw-r--r-- 1 root root 0 3月 5 10:42 qbdxjmntlg_theshu.html
-rw-r--r-- 1 root root 0 3月 5 10:42 udgufgakwk_theshu.html
-rw-r--r-- 1 root root 0 3月 5 10:42 urdcucyxxu_theshu.html

2. 总结:Linux系统产生随机数的6种方法

  • 方法1:通过系统环境变量$RANDOM实现,示例代码如下:

    1
    2
    3
    4
    [root@theshu ~]# echo $RANDOM
    23156
    [root@theshu ~]# echo $RANDOM
    31167
    • RANDOM的随机数范围为0~32767,因此,加密性不是很好,可以通过在输出的随机数后增加加密字符串(就是和密码生成有关的一个字符串)的方式解决,最后再一起执行md5sum操作并截取结果的后n位,这样一来,就无法根据随机数范围来猜出具体结果了。
    • 示例
      1
      echo "theshu$RANDOM" | md5sum | cut -c 8-15
  • 方法2:通过openssl产生随机数,示例代码如下:

    1
    2
    3
    4
    5
    [root@theshu ~]# openssl rand -base64 8
    8BZOHW5d36Y=
    [root@theshu ~]# openssl rand -base64 80
    PEJx3xbF7Om4aZW+yovQZCY1szJ3tgNEZaEjWJj5kJCIiJT8RW6UQ+hJou5GyThd
    MgdI9ZnCnQGYBGhe52sYzKMkoB6U7JM4P7QWRmrrElo=
    • 令数字与大小写字符相结合,并且带上特殊字符,可以达到很长的位数,这样的随机数很安全。
  • 方法3:通过时间(date)获取随机数,示例代码如下:

    1
    2
    3
    4
    [root@theshu ~]# date +%s%N
    1519866764460747105
    [root@theshu ~]# date +%s%N
    1519866766036338040
  • 方法4:通过/dev/urandom配合chksum生成随机数,示例代码如下:

    1
    2
    [root@theshu ~]# head /dev/urandom | cksum
    1635584842 3081
    • /dev/random设备存储着系统当前运行环境的实时数据。它可以看作系统在某个时候的唯一值,因此可以用作随机数元数据。我们可以通过文件读取的方式,读到里面的数据。/dev/urandom这个这杯的数据与random里的一样。只是,它是非阻塞的随机数发生器,读取操作不会产生阻塞。
  • 方法5:通过UUID生成随机数,示例代码如下:

    1
    2
    3
    4
    [root@theshu ~]# cat /proc/sys/kernel/random/uuid
    412be67d-1f8f-422b-b925-ea7337120890
    [root@theshu ~]# cat /proc/sys/kernel/random/uuid
    fbdd40ed-3d5b-4f30-983a-2ccabf1c871c
    • UUID码全称是通用唯一识别码(Universally Unique Identifier,UUID),它是一个软件建构的标准,亦为自由软件基金会的组织在分布式计算机环境领域的一部分。
    • UUID的目的是让分布式系统中的所有元素都能有唯一的辨识信息,而不需要通过中央控制端来做识别信息的指定。如此一来,每个人都可以创建不与其他人发生冲突的UUID。在这样的情况下,就不需要考虑数据库创建时的名称重复问题了。它会让网络中任何一台计算机所生成的UUID码都是互联网整个服务器网络中唯一的编码。它的原信息会加入硬件、时间、机器当前运行信息等。
  • 方法6:使用expect附带的mkpasswd生产随机数

    • mkpasswd命令依赖于数据包expect,因此必须通过yum install expect -y命令先安装该数据包:

      1
      2
      3
      4
      5
      6
      [root@theshu ~]# mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1
      sCc7OR2p-
      [root@theshu ~]# mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1
      bM95NC\om
      [root@theshu ~]# mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1
      Q5yi2JvP}
    • 相关参数说明如下:

      1
      2
      3
      4
      5
      -l # (length of password,default = 9) #<==指定密码长度
      -d # (min # of digits,default = 2) #<==指定密码中数字的数量
      -c # (min # of lowercase chars,default = 2) #<==指定密码中小写字母的数量
      -C # (min # of uppercase chars,default = 2) #<==指定密码中大写字母的数量
      -s # (min # of special chars,default = 1) #<==指定密码中特殊字符的数量
  • 上面的随机数长短不一,统一格式化呢?解答:使用md5sum命令。示例如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [root@theshu ~]# mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1 | md5sum | cut -c 2-10
    d161a4cd6
    [root@theshu ~]# cat /proc/sys/kernel/random/uuid | md5sum | cut -c 2-10
    424e67af0
    [root@theshu ~]# head /dev/urandom | cksum | md5sum | cut -c 2-10
    8db5ea345
    [root@theshu ~]# date +%s%N | md5sum | cut -c 2-10
    560f1cbf4
    [root@theshu ~]# openssl rand -base64 80 | md5sum | cut -c 2-10
    5e88fdf5c
    [root@theshu ~]# echo "theshu$RANDOM" | md5sum | cut -c 2-10
    63d0f00c3
0%