次の要件に従って、任意のパスワードを生成する方法が必要です。
- パスワードは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
中括弧の拡張や類似の範囲を使用せずに、他の文字を使用して特殊文字を追加できます。
ただし、明示的に1つずつ一覧表示して引用することで、シェルから保護できます。
shuf -r -n2 -e '!' '"' '#' '$' % '&' '(' ')' '*' + , - . / : ';' '<' = '>' '?' @ '[' '\' ']' '^' _ '{' '|' '}'
または、文字列に入れてトークン化を使用して複数のパラメータに入れます。ただし、グローブを無効にする必要がありますset -f
。そうしないと、アスタリスクが原因で問題が発生します。
set -f
shuf -r -n2 -e $(sed -e 's/./& /g' <<< '!"#$%&()*+,-./:;<=>?@[\]^_{|}' )
(または誰もがするように、固定された2つの特殊文字を合理的なパスワードの末尾に追加するだけです。
最初の文字が文字であることを確認する最も簡単な方法は、文字だけを追加してから、残りのパスワードに対して文字を混ぜることです。たとえば、これはパスワードを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
Herbertは以下を使用することをお勧めします。/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' )