다음 요구 사항에 따라 임의의 비밀번호를 생성하는 방법이 필요합니다.
- 비밀번호는 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
중괄호 확장 및 유사한 범위를 사용하지 않고 다른 문자를 사용하여 특수 문자를 추가할 수 있습니다 .
그러나 명시적으로 하나씩 나열하고 인용하여 셸에서 보호할 수 있습니다.
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
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' )