정규식을 사용하여 비밀번호 입력이 길이 및 특수 문자 요구 사항을 충족하는지 확인하는 bash 스크립트를 작성하는 데 도움이 필요합니다.

정규식을 사용하여 비밀번호 입력이 길이 및 특수 문자 요구 사항을 충족하는지 확인하는 bash 스크립트를 작성하는 데 도움이 필요합니다.

나는 한동안 이 작업을 해왔고 수십 개의 웹사이트를 방문하고 다양한 조합을 시도했지만 예상대로 스크립트가 실행되지 않습니다. 그 회사에서 일한다고 해도https://regex101.com/, 여전히 bash에서 작동하도록 할 수 없습니다.

입력("$password")의 길이가 8자 이상이고 하나 이상의 숫자와 다음 특수 문자 중 하나 이상이 포함되어 있는지 확인하는 bash 스크립트를 작성하려고 합니다. #?!@$ %^ &* -

GNU bash, 버전 5.1.16(1)-release-(x86_64-pc-linux-gnu)

어떤 도움이라도 대단히 감사하겠습니다!

read -p "Please enter a password to test: " password
echo "You entered '$password'"
# I have tried all of the following (plus a few others) and cannot get it to work
#regex='^[a-zA-Z0-9#@$?]{8,}$'
#regex='^[a-zA-Z0-9@#$%&*+-=]{8,}$'
#regex='^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[@#$%&*+-=]).{8,}$'
#regex='^(?=.*?[a-zA-Z0-9])(?=.*?[#?!@$ %^&*-]).{8,}$'
#regex='^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[#?!@$ %^&*-]).{8,}$'
if [[ $password =~ $regex ]]; then
        echo "This works"
else
        echo "Nope"
fi

답변1

지원되는 확장 정규식 구문에는 bash여러 하위 표현식 간에 부울 AND 테스트를 수행하는 단일 표현식을 구성하는 기능이 없습니다. 따라서 조건당 하나의 테스트를 보다 쉽게 ​​수행할 수 있습니다.

귀하의 문자열은 세 가지 조건을 충족해야 하는 것 같습니다.

  1. 8자 이상입니다.
  2. 최소한 한 자리("숫자"를 의미하는 것 같습니다).
  3. 그룹에 캐릭터가 하나 이상 있습니다 #?!@$ %^&*-.

이는 세 가지 테스트를 의미합니다.

if [ "${#password}" -ge 8 ] &&
   [[ $password == *[[:digit:]]* ]] &&
   [[ $password == *[#?!@$\ %^\&*-]* ]]
then
    echo 'good'
else
    echo 'not good'
fi

최종 테스트에서는 일부 특수 문자를 이스케이프해야 했습니다. 변수를 사용하여 더 예쁘게 보이게 만들 수 있습니다.

has_digit='*[[:digit:]]*'
has_special='*[#?!@$ %^&*-]*'  # or possibly '*[[:punct:]]*'

if [ "${#password}" -ge 8 ] &&
   [[ $password == $has_digit ]] &&
   [[ $password == $has_special ]]
then
    echo 'good'
else
    echo 'not good'
fi

여기서는 정규식을 사용하지 않고 일반적인 쉘 패턴을 사용하고 있습니다. 일치하는 세트 는 약간 더 큰 "구두점" 세트입니다(특히 공백 문자를 포함하지 않지만 또는 또는 를 [[:punct:]]사용할 수 있음 ).[[:punct:] ][[:punct:][:blank:]][[:punct:][:space:]]

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

정말로 정규 표현식을 사용해야 한다면 다음을 수행하십시오.

has_8='.{8}'
has_digit='[[:digit:]]'
has_special='[#?!@$ %^&*-]'  # or possibly '[[:punct:]]'

if [[ $password =~ $has_8 ]] &&
   [[ $password =~ $has_digit ]] &&
   [[ $password =~ $has_special ]]
then
    echo 'good'
else
    echo 'not good'
fi

변화하는 패턴을 주목하세요.


이 사이트에 대한 일반적인 주의 사항은 regex101.com대부분의 표준 Unix 텍스트 처리 도구에서 사용되는 POSIX 정규식을 특별히 지원한다고 주장하지 않고 이러한 정규식의 다양한 확장 변형만 지원한다고 주장한다는 것입니다.

답변2

옵션:

if [ ! "${password/????????*}" -a\ 
        "$password" != "${password/[0-9]}" -a\ 
        "$password" != "${password/[#?!@$ %^&*-]}" ]
then
        echo "This works"
else
        echo "Nope"
fi

하지만 제가 기억하는 한, 유효성 검사는 소문자와 대문자의 존재를 제공하므로 다음을 변경해야 함을 의미합니다.

if [ ! "${password/????????*}" -a\ 
        "$password" != "${password/[a-z]}" -a\ 
        "$password" != "${password/[A-Z]}" -a\ 
        "$password" != "${password/[0-9]}" -a\ 
        "$password" != "${password/[#?!@$ %^&*-]}" ]

관련 정보