一、bash有內建的隨機數生成器:
在shell中有一個環境變量RANDOM,它的范圍是0--32767
1、如果我們想要產生0-25范圍內的數,如何做呢?如下:
用這個環境變量對26取模,就可以得到最小是0,最大是25的數了。
echo
RANDOM%26]
2、如果想得到1--68范圍內的數,可以這樣
前面可以得到最小為0,最大為67的隨機數,再加上1,很自然的就可以得到最大為1,最小為68的數了。
echo
RANDOM%68+1]
3、如果想得到6--87范圍內的數。可以這樣
前面可以得到最小為0,最大為81的隨機數,再加上6,很自然的就可以得到最大為87,最小為6的數了。
echo $$[RANDOM%82+6]
通過上面三個例子,其它范圍內的數一樣可以用這種方法產生,總結出規律來
可以類推其它范圍內數了
二、Linux系統提供的隨機偽設備
介紹:
1、/dev/random和/dev/urandom是Linux系統中提供的隨機偽設備,這兩個設備的任務,是提供永不為空的隨機字節數據流。很多解密程序與安全應用程序(如SSH Keys,SSL Keys等)需要它們提供的隨機數據流。
2、這兩個設備的差異在于:/dev/random的random pool依賴于系統中斷,因此在系統的中斷數不足時,/dev/random設備會一直封鎖,嘗試讀取的進程就會進入等待狀態,直到系統的中斷數充分夠用, /dev/random設備可以保證數據的隨機性。/dev/urandom不依賴系統的中斷,也就不會造成進程忙等待,但是數據的隨機性也不高。
什么時中斷?
中斷其實就是由硬件或軟件所發送的一種稱為IRQ(中斷請求)的信號。
中斷允許讓設備,如鍵盤,串口卡,并口等設備表明它們需要CPU。
一旦CPU接收了中斷請求,CPU就會暫時停止執行正在運行的程序,并且調用一個稱為中斷處理器或中斷服務程序(interrupt service routine)的特定程序。
中斷服務程序或中斷處理器可以在中斷向量表中找到,而這個中斷向量表位于內存中的固定地址中。中斷被CPU處理后,就會恢復執行之前被中斷的程序。
3、dev/urandom 和dev/random,都是產生用不為空的隨機字符流,區別是
/dev/random設備會封鎖,直到系統產生的隨機字符流已經充分夠用,所以耗用時間較長
/dev/urandom設備不會封鎖,數據的隨機程度不高,但是一般情況已經夠用
4、使用/dev/random比使用/dev/urandom產生大量隨機數的速度要慢
[root@centos7 bin]#cat /dev/urandom | head -c15
g@ RJ?
[root@centos7 bin]#
通過過濾賽選可以取出隨機數或隨機字母如下
產生隨機字母方式:
[root@centos7 bin]#cat /dev/urandom | tr -dc '[:alpha:]' | head -c8
NbvFFlhs
[root@centos7 bin]#
產生隨機數字方式
[root@centos7 bin]#cat /dev/urandom 100 | tr -dc '[:digit:]'|head -c8
25786670
[root@centos7 bin]#
三、openssl rand 生成隨機字符
用途:
用來產生偽隨機字節。隨機數字產生器需要一個seed,先已經說過了,在沒有/dev/srandom系統下的解決方法是自己做一個~/.rnd文件。如果該程序能讓隨機數字產生器很滿意的被seeded。程序寫回一些怪怪的東西回該文件。
用法:
openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num
選項說明:
-out file:結果輸出到file中。
-rand file(s):指定隨機數種子文件,多個文件間用分隔符分開,windows用“;”,OpenVMS用“,“,其他系統用“:”。
-base64:輸出結果為BASE64編碼數據。
-hex:輸出結果為16進制數據。
num:隨機數長度。
實例:
[root@centos7 bin]#openssl rand 12
*II+p?
[root@centos7 bin]#
可以看見,這12個字節的隨機數顯示為亂碼,可以對隨機字符串進行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
通過過濾賽選可以取出隨機數或隨機字母如下
產生隨機字母方式:
[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]#
產生隨機數字方式
[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]#
四、應用
字體加顏色
\033[33m 字符 \033[0m [[31m 字符 [[0m
隨機顏色
color=RANDOM%8+31]
\033[${color}m 字符 \033[0m
存放顏色案例的文件
cat /etc/DIR_COLORS