我需要一種按照以下要求產生隨機密碼的方法:
- 密碼至少9個字符
- 至少 2 個大寫字母
- 至少2個小寫字母
- 至少 2 位數字
- 至少 2 個特殊字符
- 必須以字母開頭
這是我的命令:
{ shuf -r -n4 -e {A..Z}; shuf -r -n4 -e {a..z}; shuf -r -n4 -e {0..9}; } | shuf | tr -d $'\n'
但缺少特殊字符
作業系統是 SuSE 12
答案1
您可以使用另一個添加特殊字符shuf
,但不能使用大括號擴展和類似的範圍。
但是您可以明確地一一列出它們,並引用它們以保護它們免受 shell 的影響:
shuf -r -n2 -e '!' '"' '#' '$' % '&' '(' ')' '*' + , - . / : ';' '<' = '>' '?' @ '[' '\' ']' '^' _ '{' '|' '}'
或者將它們放入字串中並使用分詞將它們放入多個參數中。不過,需要停用 globbing set -f
,否則星號會導致問題:
set -f
shuf -r -n2 -e $(sed -e 's/./& /g' <<< '!"#$%&()*+,-./:;<=>?@[\]^_{|}' )
(或只是做每個人都會做的事情,並在其他合理的密碼末尾添加兩個固定的特殊字符,即使沒有它們,該密碼也足夠長。)
為了確保第一個字元是字母,最簡單的方法是單獨添加一個字母,然後只打亂密碼其餘部分的字元。例如,這會將密碼分為兩部分,第一個是單個字母(大寫或小寫),第二個是您在註釋中的內容:
#!/bin/bash
set -f
pw=$(shuf -r -n1 -e {A..Z} {a..z})
pw="$pw$( { shuf -r -n4 -e {A..Z}; shuf -r -n4 -e {a..z}; shuf -r -n4 -e {0..9}; shuf -r -n2 -e $(sed -e 's/./& /g' <<< '@%+\/!#$^?:.(){}[]-_.'); } | shuf | tr -d '\n' )"
echo "$pw"
輸出將是這樣的:
$ bash pw.sh
WRgpJ7pP%Tj60.1
$ bash pw.sh
oV6N#7s4Po3Bt)r
答案2
看一眼如何產生隨機字串?
赫伯特建議使用/dev/urandom
tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' </dev/urandom | head -c 13 ; echo
400 Cat 提供的解決方案openssl
openssl rand -base64 12
問題是這些解決方案都不能保證您擁有所需的所有字元(即 2 個數字、2 個特殊字元等)。
使用shuf
並基於您的原始程式碼,您可以執行類似的操作
shuf -r -n1 -e {a..z} {A..Z} | tr -d $'\n'; { shuf -r -n2 -e {0..9}; shuf -r -n2 -e {a..z}; shuf -r -n2 -e {A..Z}; shuf -r -n2 -e { \! \" \# $ % \& '\' '/' \( \) \{ \} [ ] \< \> + - = . , : \; ? @ \| \` \~ ^ _ "'" \* }; } | shuf | tr -d $'\n'
為了可讀性分為幾行:
shuf -r -n1 -e {a..z} {A..Z} | tr -d $'\n';
{ shuf -r -n2 -e {0..9};
shuf -r -n2 -e {a..z};
shuf -r -n2 -e {A..Z};
shuf -r -n2 -e { \! \" \# $ % \& '\' '/' \( \) \{ \} [ ] \< \> + - = . , : \; ? @ \| \` \~ ^ _ "'" \* }; } | shuf | tr -d $'\n'
這將產生一個以字母開頭的字串(請注意,我沒有將第一行通過管道傳輸到最後一行shuf
),並且有 2 個小寫字母、2 個大寫字母和 2 個數字(總共 9 個字元)
答案3
最後,這是最終命令:
export PASSWORD=$(shuf -r -n1 -e {A..Z} {a..z})$( { shuf -r -n4 -e {A..Z}; shuf -r -n4 -e {a..z}; shuf -r -n4 -e {0..9}; shuf -r -n2 -e $(sed -e 's/./& /g' <<< '@%+\/!#$^?:.(){}[]-_.'); } | shuf | tr -d '\n' )