다음 요구 사항에 따라 임의의 비밀번호를 생성하는 방법이 필요합니다.
- 비밀번호는 최소 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는 SuSE 12입니다.
답변1
다른 문자를 사용하여 특수 문자를 추가할 수 있지만 shuf
중괄호 확장 및 범위는 사용할 수 없습니다.
그러나 셸로부터 보호하기 위해 하나씩 인용하여 명시적으로 나열할 수 있습니다.
shuf -r -n2 -e '!' '"' '#' '$' % '&' '(' ')' '*' + , - . / : ';' '<' = '>' '?' @ '[' '\' ']' '^' _ '{' '|' '}'
또는 문자열에 넣고 단어 분할을 사용하여 여러 인수로 가져옵니다. 하지만 으로 글로빙을 비활성화해야 합니다 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'
문자로 시작하는 문자열을 생성하고(첫 번째 줄을 last 로 연결하지 않음 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' )