어떻게 BASH 스크립트에서 다음 정규식을 사용할 수 있습니까?강력한 암호 용 Bash 정규식
- 적어도 하나의 대문자를 :
(?=^.{8,255}$)((?=.*\d)(?!.*\s)(?=.*[A-Z])(?=.*[a-z]))^.*
나는 다음의 사용자 입력 (비밀번호)를 확인해야합니다.
- 적어도 하나의 숫자.
- 하나 이상의 작은 글자.
- 이고 비밀번호는 8 자에서 255 자 사이 여야합니다.
어떻게 BASH 스크립트에서 다음 정규식을 사용할 수 있습니까?강력한 암호 용 Bash 정규식
(?=^.{8,255}$)((?=.*\d)(?!.*\s)(?=.*[A-Z])(?=.*[a-z]))^.*
나는 다음의 사용자 입력 (비밀번호)를 확인해야합니다.
귀하의 정규 표현식이 귀하의 목록에있는 항목을 확인하는 가장 좋은 방법이라고 생각하지 않습니다. (힌트 : 다른 조건과는 독립적으로 길이를 확인합니다.) 그러나 배쉬에서 그것을 사용하는 방법에 대한 질문에 대답하기 : 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
옵션
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;'
제안 해 주셔서 감사하지만 스크립트를 단순하게 유지하고 싶습니다. 다른 모듈이나 Perl과 같은 프로그래밍 언어에 의존하지 않기를 바랍니다. – Debianuser
이러한 일치 항목은 논리 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
위의 코드는 제가 찾고있는 코드입니다. 고마워요! – Debianuser
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
'에코 weak'는 새 태그를해야 ... 주석에 대한 키우면-항상 금요일 -에 - iceland' – beggs
감사합니다 '옆에 가야하지만 난 내가 가지고있는이 떠들썩한 파티에서 수행해야하는 다른 많은 일을하는 스크립트. – Debianuser
분명히 'ruby' 나'perl'을 Bash 스크립트에서 호출 할 수 있습니다. 문제가 없다면 grep을 호출하는 것과 유사합니다. 또는 순수한 Bash를 사용한다면,'= ~'(Bash 3.x라고 가정 할 때)을 사용하십시오. 그러나 정규 표현식을 수정해야합니다 ('grep'과 동일합니다). – Arkku