부정 예측을 사용하여 특정 특수 문자를 제외하는 Bash 비밀번호의 정규식 패턴

부정 예측을 사용하여 특정 특수 문자를 제외하는 Bash 비밀번호의 정규식 패턴

다음 조건으로 비밀번호 입력 템플릿을 만들고 싶습니다.

  1. 비밀번호 길이는 12자 이상이어야 합니다.
  2. 최소 1개의 소문자, 1개의 대문자, 1개의 숫자, 1개의 특수문자가 있어야 합니다.
  3. 다음과 같은 특정 특수 문자<>``````~허용되지 않습니다.
  4. 처음 세 가지 조건이 충족되는 한 순서는 중요하지 않습니다.

패턴을 만들기 위해 부정적인 예측을 활용했지만 작동하지 않습니다. 내 패턴:

^(.{0,11}|[^0-9]*|[^A-Z]*|[^a-z]*|[a-zA-Z0-9<>~`|"\']*|[^\s]*\s.*)$

운영 체제: 우분투 20.04

답변1

귀하의 질문에는 표현을 어떻게 사용하려고 하는지 언급되어 있지 않습니다. 셸의 정규식은 bashPOSIX 확장 정규식입니다. 이는 긍정적이거나 부정적인 미리보기 또는 뒤돌아보기를 지원하지 않습니다.

표현식을 사용하여 더 많은 내용을 적용하는 대신 테스트를 여러 개의 별도 테스트로 나누는 것이 좋습니다.

모든 작업을 수행하기 위해 괴물 같은 표현을 만들려고 노력하는 것보다 각 테스트가 독립적으로 수행되는 경우 구현을 이해하고 유지 관리하는 것이 가장 쉽습니다.

#!/bin/bash

pw_is_valid () {
        local avoid='[<>`"'"'"'~]'

        [ "${#1}" -ge 12 ] &&
        [[ $1 =~ [[:upper:]] ]] &&
        [[ $1 =~ [[:lower:]] ]] &&
        [[ $1 =~ [[:digit:]] ]] &&
        [[ $1 =~ [[:punct:]] ]] &&
        [[ ! $1 =~ $avoid ]]
}

until
        IFS= read -r -s -p 'Enter password: ' pw
        pw_is_valid "$pw"
do
        echo 'Try again' >&2
done

avoid정규식 [<>`"'~]을 표현하는 데 필요한 참조 수를 줄이기 위해 변수를 사용하여 정규식을 유지합니다.

POSIX일명 로케일 에서 CPOSIX [:punct:]문자 클래스에는 다음 문자 세트의 문자가 포함됩니다.

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

일반 영역에는 일반적으로 더 많은 콘텐츠가 있습니다.

여기서는 "특수 문자"를 대신하여 사용하고 있습니다.


1 예를 들어 Ubuntu 20.04 및 en_GB.UTF-8 로케일에는 147495개의 서로 다른 문자가 포함되어 있습니다. YMMV는 시스템, 버전 및 로케일에 따라 다릅니다.

관련 정보