이 비밀번호 생성기에서 하나의 특수 문자만 생성하는 방법

이 비밀번호 생성기에서 하나의 특수 문자만 생성하는 방법

여러 특수 문자가 포함된 비밀번호를 생성하는 명령이 있습니다. 특수 문자를 1개만 생성하려면 어떻게 해야 합니까?

# Generate a random password
#  $1 = number of characters; defaults to 32
#  $2 = include special characters; 1 = yes, 0 = no; defaults to 1
function randpass() {
  [ "$2" == "0" ] && CHAR="[:alnum:]" || CHAR="[:graph:]"
    cat /dev/urandom | tr -cd "$CHAR" | head -c ${1:-32}
    echo
}

답변1

이를 수행하는 방법에는 여러 가지가 있습니다.

1. "좋아하는" 비밀번호를 얻을 때까지 계속 반복하세요.

while true
do
    word=$(tr -cd "[:graph:]" < /dev/urandom | head -c ${1:-32})
    if [[ "$word" =~ [[:punct:]].*[[:punct:]] ]]
    then
        echo "$word has multiple special characters - reject."
        continue
    fi
    if [[ "$word" =~ [[:punct:]] ]]
    then
        echo "$word has one special character - accept."
        break
    fi
    echo "$word has no special characters - reject."
    continue
done

경고: 문자 수가 많은 경우(예: 16자 이상) 시간이 오래 걸릴 수 있습니다.

2. 구두점을 읽은 후 중지

n=${1:-32}
if [ "$2" == "0" ]
then
    CHAR="[:alnum:]"
else
    CHAR="[:graph:]"
fi
word=
for ((i=0; i<n; i++))
do
    thischar=$(tr -cd "$CHAR" < /dev/urandom | head -c 1)
    if ! [[ "$thischar" =~ [[:alnum:]] ]]
                            # Probably equivalent to if [[ "$thischar" =~ [[:punct:]] ]]
    then
        # Got one special character – don’t allow any more.
        echo "$thischar is a special character."
        CHAR="[:alnum:]"
    fi
    word="$word$thischar"
done
echo "$word"

이는 처음 3개의 특수 문자(예: ab!defghijklmnopqrstuvwxyz123456) 를 가져옵니다.매우 자주. 또한, 이 방법을 사용하면 이론적으로 특수문자가 포함되지 않은 비밀번호를 얻는 것도 가능합니다.

답변2

[:alnum:]먼저 32자를 생성한 다음 선택적으로 특수 문자를 삽입 할 것이라고 생각했습니다 .

function randpass() {
  passwd=$( < /dev/urandom tr -cd "[:alnum:]" | head -c $1)
  if [ "$2" == "0" ]; then
    echo "$passwd"
  else
    spchar=$( < /dev/urandom tr -cd "[:punct:]" | head -c 1)
    pos=$((RANDOM%$1))
    echo "${passwd:0:pos}${spchar}${passwd:pos+1:$1}"
  fi
}

나는 [:punct:]당신이 "특별"하다고 생각하는 모든 문자가 포함되어 있다고 가정합니다.

구문 은 다음 $(( ))과 같습니다쉘 산술 확장0에서 31 사이의 난수(또는 임의의 숫자 $1)를 생성합니다.

구문 은 다음 ${var:offset:length}과 같습니다쉘 매개변수 확장문자열에서 부분 문자열을 반환합니다.

답변3

head명령을 다음으로 변경 하십시오 -c 1.

# Generate a random password
#  $1 = number of characters; defaults to 32
#  $2 = include special characters; 1 = yes, 0 = no; defaults to 1
function randpass() {
  [ "$2" == "0" ] && CHAR="[:alnum:]" || CHAR="[:graph:]"
    cat /dev/urandom | tr -cd "$CHAR" | head -c 1
    echo
}

관련 정보