如何在 SuSe 12 中建立隨機複雜密碼

如何在 SuSe 12 中建立隨機複雜密碼

我需要一種按照以下要求產生隨機密碼的方法:

  • 密碼至少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' )

相關內容