2010-11-18 2 views
2

어떻게 BASH 스크립트에서 다음 정규식을 사용할 수 있습니까?강력한 암호 용 Bash 정규식

  1. 적어도 하나의 대문자를 :

    (?=^.{8,255}$)((?=.*\d)(?!.*\s)(?=.*[A-Z])(?=.*[a-z]))^.* 
    

    나는 다음의 사용자 입력 (비밀번호)를 확인해야합니다.

  2. 적어도 하나의 숫자.
  3. 하나 이상의 작은 글자.
  4. 이고 비밀번호는 8 자에서 255 자 사이 여야합니다.

답변

1

귀하의 정규 표현식이 귀하의 목록에있는 항목을 확인하는 가장 좋은 방법이라고 생각하지 않습니다. (힌트 : 다른 조건과는 독립적으로 길이를 확인합니다.) 그러나 배쉬에서 그것을 사용하는 방법에 대한 질문에 대답하기 : grep -Eq의 반환 값, 예를 들어, 사용 배쉬 3 또는

if echo "$candidate_password" | grep -Eq "$strong_pw_regex"; then 
    echo strong 
else 
    echo weak 
fi 

을하고 나중에는 =~ 연산자를 사용할 수 있습니다

if [[ "$candidate_password" =~ "$strong_pw_regex" ]]; then 
    … 
fi 

의 정규 표현식 구문 grep -E 또는 Bash가 예제에서 사용중인 모든 것을 반드시 지원하는 것은 아니지만 둘 중 하나를 사용하여 요구 사항을 확인할 수 있습니다. 그러나 더 정교한 정규 표현식을 원한다면 Ruby 나 Perl을 Bash로 대체해야 할 것입니다.

정규 표현식을 수정하는 경우 Bash (${#candidate_password})의 길이를 변수 candidate_password의 문자열 길이로 제공 한 다음 간단한 미리보기가없는 간단한 구문을 사용하십시오. 단순화를 위해 별도의 정규식을 사용하여 세 조건을 모두 확인할 수도 있습니다. -E 옵션

+0

'에코 weak'는 새 태그를해야 ... 주석에 대한 키우면-항상 금요일 -에 - iceland' – beggs

+0

감사합니다 '옆에 가야하지만 난 내가 가지고있는이 떠들썩한 파티에서 수행해야하는 다른 많은 일을하는 스크립트. – Debianuser

+0

분명히 'ruby' 나'perl'을 Bash 스크립트에서 호출 할 수 있습니다. 문제가 없다면 grep을 호출하는 것과 유사합니다. 또는 순수한 Bash를 사용한다면,'= ~'(Bash 3.x라고 가정 할 때)을 사용하십시오. 그러나 정규 표현식을 수정해야합니다 ('grep'과 동일합니다). – Arkku

0

grep 앞서 볼을 지원하지 않습니다이 documentation ERE에서 확장 정규식 (ERE)
을 사용합니다.

그래서 당신은이 펄을 사용할 수 있습니다 : 당신이 정규식 찾고있는 것을 얻을

perl -ne 'exit 1 if(/(?=^.{8,255}$)((?=.*\\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.*/);exit 0;' 

Ideone Link

0

,하지만 당신은 PAM 모듈을 통해 그 일을 고려 했는가? quality

dictionary

    • 는 다른 흥미로운 모듈이있을 수 있습니다.

  • +0

    제안 해 주셔서 감사하지만 스크립트를 단순하게 유지하고 싶습니다. 다른 모듈이나 Perl과 같은 프로그래밍 언어에 의존하지 않기를 바랍니다. – Debianuser

    0

    이러한 일치 항목은 논리 AND 연산자와 연결됩니다. 일치하는 항목은 모든 항목이 일치하는 경우뿐입니다. 그러므로 가장 간단한 방법은 이전 결과를 다음 표현식으로 파이프 처리하여 체인 된 조건을 일치시키는 것입니다.성냥 중 하나가 실패 할 경우, 전체 표현식이 실패 : 다른 시스템 로케일 [AABBCC로 대체 할 수 있기 때문에

    $echo "tEsTstr1ng" | egrep "^.{8,255}"| egrep "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"| egrep "[abcdefghijklmnopqrstuvwxyz"] | egrep "[0-9]" 
    

    내가 수동으로 "[AZ]"을 "[AZ]"대신 모든 문자를 입력하고 .. . 이것은 한 경기에서 두 조건이며 우리는 모두 조건을 확인해야합니다. 쉘 스크립트로

    :

    #!/bin/sh 
    a="tEsTstr1ng" 
    b=`echo $a | egrep "^.{8,255}" | \ 
          egrep "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]" | \ 
          egrep "[abcdefghijklmnopqrstuvwxyz"] | \ 
          egrep "[0-9]"` 
    # now featuring W in the alphabet string 
    #if the result string is empty, one of the conditions has failed 
    if [ -z $b ] 
        then 
        echo "Conditions do not match" 
        else 
        echo "Conditions match" 
    fi 
    
    +0

    위의 코드는 제가 찾고있는 코드입니다. 고마워요! – Debianuser

    2

    grep의 버전이이 PCRE (Perl 호환 정규 표현식을 지원하는 -P 옵션

    grep -P '(?=^.{8,255}$)(?=^[^\s]*$)(?=.*\d)(?=.*[A-Z])(?=.*[a-z])' 
    

    내가 가진 공간을 거부 할 표현식을 변경할 수있는 경우. 왜냐하면 항상 실패했기 때문입니다. 괄호의 추가 세트는 필요하지 않은 것처럼 보입니다. 나는 항상 일치하므로 실제로는 다음과 같은 부울 결과 만 필요하기 때문에 ^.*을 끝냅니다.

    while ! echo "$password" | grep -P ... 
    do 
        read -r -s -p "Please enter a password: " password 
    done