次の要件に従ってランダムなパスワードを生成する方法が必要です:
- パスワードは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'
しかし、特殊文字が欠けている
OSはSuSE12です
答え1
別の を使って特殊文字を追加することもできますがshuf
、そのように中括弧の展開や範囲を使用することはできません。
ただし、シェルから保護するために、引用符で囲んで 1 つずつ明示的にリストすることもできます。
shuf -r -n2 -e '!' '"' '#' '$' % '&' '(' ')' '*' + , - . / : ';' '<' = '>' '?' @ '[' '\' ']' '^' _ '{' '|' '}'
または、それらを文字列に押し込んで単語分割を使用して複数の引数に取得します。set -f
ただし、を使用してグロブを無効にする必要があります。そうしないと、アスタリスクによって問題が発生します。
set -f
shuf -r -n2 -e $(sed -e 's/./& /g' <<< '!"#$%&()*+,-./:;<=>?@[\]^_{|}' )
(または、誰もがやっているように、特殊文字がなくても十分な長さの、それ以外は意味のあるパスワードの末尾に固定の特殊文字を 2 つ追加します。)
最初の文字が文字であることを確認するには、文字を 1 つ別々に追加し、パスワードの残りの文字のみをシャッフルするのが最も簡単です。たとえば、パスワードは 2 つの部分で構成され、最初の部分は単一の文字 (大文字または小文字) で、2 番目はコメントに記載された文字になります。
#!/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猫は解決策を提案します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' )