如何在Linux终端生成随机字符
一、随机数生成器
要在Linux/Unix发行版中生成随机数据,有种选择:/dev/random
或者/dev/urandom
。
这些设备是存储随机生成的数据的特殊文件。如果用ls -l
查看文件属性则显示为字符型设备文件。它们可以像普通文件一样读取,并且读取的数据是通过系统中提供随机性的多个熵源生成的。
/dev/random
会从设备驱动收集环境噪音到一个熵池,比如CPU、硬盘、鼠标等,随机数就从该熵池中获取。当熵池中的数据用完之后,就会处于阻塞状态,,直到收集到额外的环境噪音。/dev/random
是一个传统的接口,现在在大部分场合下已经被/dev/urandom
替代。
/dev/urandom
同样是从熵池中请求随机数。但是如果请求的随机数据比较庞大,在熵池中数据耗尽后会使用SHA
、MD5
或者其它算法来产生数据。也就意味着/dev/urandom
并不会阻塞,并且生成的随机数并不一定真的随机。相对来说,/dev/random
生成的随机数随机程度更高。
通过以下命令可以查看系统中熵池的大小,单位为二进制位数。
cat /proc/sys/kernel/random/poolsize
二、random 和 urandom 的区别
1. 区别
项目randomurandom小数据随机程度非常高非常高大数据随机程度可能因为熵池耗尽而阻塞,
直到收集到新的环境噪音。比较高是否会阻塞是否响应速度慢快
2. 应用场景
根据不同的特点可以在不同的场景使用。
/dev/urandom
应用场景:
生成一个随机数据构成的文件用于测试。
使用
dd
命令把随机数据写入硬盘以达到擦除硬盘的效果。
/dev/random
应用场景:
一次性密码、生成密钥。
三、应用
1. 生成密码
生成10位纯数字的密码
tr -dc '0-9' < /dev/random | head -c 10
生成10位包含大小写字母和数字的密码
tr -dc 'a-zA-Z0-9' < /dev/random | head -c 10
或
tr -dc [:alnum:] < /dev/random | head -c 10
2. 生成文件
生成
BASE64
编码的随机文件base64 < /dev/random | head -c 1000 > test.txt
生成1G大小的包含随机数据的文件
head -c 1G /dev/urandom > myfile
或
dd bs=1G count=1 dd if=/dev/random of=myfile
3. 覆盖存储设备数据
使用
/dev/urandom
进行覆盖将
sdX
替换为要覆盖的存储设备。dd if=/dev/urandom of=/dev/sdX
使用
/dev/zero
进行覆盖将
sdX
替换为要覆盖的存储设备。dd if=/dev/zero of=/dev/sdX