一盹舞、bash有內(nèi)建的隨機數(shù)生成器:
在shell中有一個環(huán)境變量RANDOM,它的范圍是0--32767
1、如果我們想要產(chǎn)生0-25范圍內(nèi)的數(shù)癣亚,如何做呢?如下:
用這個環(huán)境變量對26取模述雾,就可以得到最小是0玻孟,最大是25的數(shù)了。
echo RANDOM%26]
2黍翎、如果想得到1--68范圍內(nèi)的數(shù),可以這樣
前面可以得到最小為0趟紊,最大為67的隨機數(shù)碰酝,再加上1,很自然的就可以得到最大為1送爸,最小為68的數(shù)了。
echo RANDOM%68+1]
3、如果想得到6--87范圍內(nèi)的數(shù)饭入。可以這樣
前面可以得到最小為0爽航,最大為81的隨機數(shù)乾忱,再加上6,很自然的就可以得到最大為87衷佃,最小為6的數(shù)了蹄葱。
echo $$[RANDOM%82+6]
通過上面三個例子锄列,其它范圍內(nèi)的數(shù)一樣可以用這種方法產(chǎn)生惯悠,總結(jié)出規(guī)律來
可以類推其它范圍內(nèi)數(shù)了
二、Linux系統(tǒng)提供的隨機偽設(shè)備
介紹:
1克婶、/dev/random和/dev/urandom是Linux系統(tǒng)中提供的隨機偽設(shè)備,這兩個設(shè)備的任務(wù)鸭蛙,是提供永不為空的隨機字節(jié)數(shù)據(jù)流紫岩。很多解密程序與安全應(yīng)用程序(如SSH Keys,SSL Keys等)需要它們提供的隨機數(shù)據(jù)流。
2歇万、這兩個設(shè)備的差異在于:/dev/random的random pool依賴于系統(tǒng)中斷勋陪,因此在系統(tǒng)的中斷數(shù)不足時,/dev/random設(shè)備會一直封鎖诅愚,嘗試讀取的進(jìn)程就會進(jìn)入等待狀態(tài),直到系統(tǒng)的中斷數(shù)充分夠用, /dev/random設(shè)備可以保證數(shù)據(jù)的隨機性刹前。/dev/urandom不依賴系統(tǒng)的中斷雌桑,也就不會造成進(jìn)程忙等待,但是數(shù)據(jù)的隨機性也不高拣技。
什么時中斷耍目?
中斷其實就是由硬件或軟件所發(fā)送的一種稱為IRQ(中斷請求)的信號。
中斷允許讓設(shè)備邪驮,如鍵盤,串口卡衔掸,并口等設(shè)備表明它們需要CPU。
一旦CPU接收了中斷請求较曼,CPU就會暫時停止執(zhí)行正在運行的程序振愿,并且調(diào)用一個稱為中斷處理器或中斷服務(wù)程序(interrupt service routine)的特定程序。
中斷服務(wù)程序或中斷處理器可以在中斷向量表中找到冕末,而這個中斷向量表位于內(nèi)存中的固定地址中。中斷被CPU處理后枪孩,就會恢復(fù)執(zhí)行之前被中斷的程序藻肄。
3、dev/urandom 和dev/random攻询,都是產(chǎn)生用不為空的隨機字符流州弟,區(qū)別是
/dev/random設(shè)備會封鎖,直到系統(tǒng)產(chǎn)生的隨機字符流已經(jīng)充分夠用婆翔,所以耗用時間較長
/dev/urandom設(shè)備不會封鎖,數(shù)據(jù)的隨機程度不高阴挣,但是一般情況已經(jīng)夠用
4纺腊、使用/dev/random比使用/dev/urandom產(chǎn)生大量隨機數(shù)的速度要慢
[root@centos7 bin]#cat /dev/urandom | head -c15
g@ RJ?
[root@centos7 bin]#
通過過濾賽選可以取出隨機數(shù)或隨機字母如下
產(chǎn)生隨機字母方式:
[root@centos7 bin]#cat /dev/urandom | tr -dc '[:alpha:]' | head -c8
NbvFFlhs
[root@centos7 bin]#
產(chǎn)生隨機數(shù)字方式
[root@centos7 bin]#cat /dev/urandom 100 | tr -dc '[:digit:]'|head -c8
25786670
[root@centos7 bin]#
三茎芭、openssl rand 生成隨機字符
用途:
用來產(chǎn)生偽隨機字節(jié)。隨機數(shù)字產(chǎn)生器需要一個seed壹粟,先已經(jīng)說過了,在沒有/dev/srandom系統(tǒng)下的解決方法是自己做一個~/.rnd文件洪添。如果該程序能讓隨機數(shù)字產(chǎn)生器很滿意的被seeded雀费。程序?qū)懟匾恍┕止值臇|西回該文件。
用法:
openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num
選項說明:
-out file:結(jié)果輸出到file中盏袄。
-rand file(s):指定隨機數(shù)種子文件,多個文件間用分隔符分開逛尚,windows用“;”刁愿,OpenVMS用“,“,其他系統(tǒng)用“:”滤钱。
-base64:輸出結(jié)果為BASE64編碼數(shù)據(jù)枷踏。
-hex:輸出結(jié)果為16進(jìn)制數(shù)據(jù)。
num:隨機數(shù)長度旭蠕。
實例:
[root@centos7 bin]#openssl rand 12
*II+p?
[root@centos7 bin]#
可以看見,這12個字節(jié)的隨機數(shù)顯示為亂碼佑稠,可以對隨機字符串進(jìn)行base64編碼或用hex格式顯示
[root@centos7 bin]#openssl rand -base64 30
Abpd8tiUxE4jiWxTi5ixuzPCv4U09/w1yl3/9zpn
[root@centos7 bin]#
[root@centos7 bin]#openssl rand -base64 -out outfile 30
[root@centos7 bin]#cat outfile
SbTi2ljqeX1Yoiga+P0CeEhQfTJ7TvEdRcTo/NK3
[root@centos7 bin]#
[root@centos7 bin]#openssl rand -hex 12
c4f80294bf1ccaf730155265
[root@centos7 bin]#openssl rand -base64 12
DLcY1c+cRGIAPntE
通過過濾賽選可以取出隨機數(shù)或隨機字母如下
產(chǎn)生隨機字母方式:
[root@centos7 bin]#openssl rand -base64 100 | tr -dc '[:alpha:]'|head -c8
gVbdJqeF
[root@centos7 bin]#openssl rand -base64 100 | tr -dc '[:alpha:]'|head -c8
ukuIhCkX
[root@centos7 bin]#
產(chǎn)生隨機數(shù)字方式
[root@centos7 bin]#openssl rand -base64 100 | tr -dc '[:digit:]'|head -c8
03448683
[root@centos7 bin]#openssl rand -base64 100 | tr -dc '[:digit:]'|head -c8
74737756
[root@centos7 bin]#
四舌胶、應(yīng)用
字體加顏色
\033[33m 字符 \033[0m [[31m 字符 [[0m
隨機顏色
color=RANDOM%8+31]
\033[${color}m 字符 \033[0m
存放顏色案例的文件
cat /etc/DIR_COLORS