여러 특수 문자가 포함된 비밀번호를 생성하는 명령이 있습니다. 특수 문자를 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
}