Я арестовываю голову на этом долгое время. Эта программа средства проверки пароля гарантирует, что данный пароль включает:
Код работает почти прекрасный, за исключением прописных букв. Когда единственный капитал вставляется как пароль, программа изменяет значение flagncap, в то время как это не было должно. Кто-либо может помочь?
#!/bin/bash
echo "Please enter password: "
read user_passwd
flaglng=0
flagcap=0
flagncap=0
flagnum=0
if [[ ${#user_passwd} -ge 10 ]]; then
flaglng=1
fi
if [[ "$user_passwd" = *[A-Z]* ]]; then
flagcap=1
fi
if [[ "$user_passwd" = *[a-z]* ]]; then
flagncap=1
fi
if [[ "$user_passwd" = *[0-9]* ]]; then
flagnum=1
fi
if [[ "$flaglng" == 1 && "$flagcap" == 1 && "$flagncap" == 1 && "$flagnum" == 1 ]]; then
echo "Password Strong!"
fi
if [[ "$flaglng" = 0 ]]; then
echo "Weak Password! It should include at least 10 characters."
fi
if [[ "$flagcap" = 0 ]]; then
echo "Weak Password! It should include at least 1 upper case letter."
fi
if [[ "$flagncap" = 0 ]]; then
echo "Weak Password! It should include at least 1 lower case letter."
fi
if [[ "$flagnum" = 0 ]]; then
echo "Weak Password! It should include at least 1 number."
fi
Каждый раз, когда Вы работаете с диапазонами символов, это - очень хорошая идея вставить export LC_ALL=C
(или C.UTF-8
если Вы нуждаетесь в поддержке для символов вне диапазона ASCII) в начале сценария, иначе Вы можете быть удивлены какой A-Z
и a-z
средний...
Например:
$ unset LC_ALL
$ export LANG=en_US.UTF-8
$ [[ 'abc' = *[A-Z]* ]] && echo Match || echo No match
Match
$ export LC_ALL=C
$ [[ 'abc' = *[A-Z]* ]] && echo Match || echo No match
No match
Оболочка берет диапазон [A-Z]
означать все символы который вид между A
и Z
в текущей локали. В en_US
локаль b
виды между A
и Z
; следовательно abc
соответствия *[A-Z]*
. С другой стороны, в C
локаль b
не сортирует между A
и Z
, потому что в C
вид символов локали строго в соответствии с их кодовой точкой.
Во-первых, Вам не нужно это многие ветвление if
s. Как, вообще. Вместо этого сделайте что-то вроде этого:
goodpassword=1
...
if [[ "$user_passwd" = *[A-Z]* ]]; then
echo "Weak Password! It should include at least 1 upper case letter."
goodpassword=0
fi
...
if [[ "$goodpassword" = 1 ]]; then
echo "Good password!"
fi
Для устранения проблемы с шариками используйте регулярные выражения вместо этого. Отбросьте *
и используйте ~
.
if [[ "$user_passwd" =~ [A-Z] ]]; then
flagcap=1
fi
Regexes в целом дают Вам путь больше управления и возможности с соответствием и проверкой. Можно, на самом деле, уплотнить этот весь сценарий вниз в единственное регулярное выражение, если Вы хотели (хотя Вы потеряете многословие).
Образец:
$ ./pwcheck.sh
Please enter password :
a
Weak Password! It should include at least 10 characters.
Weak Password! It should include at least 1 upper case letter.
Weak Password! It should include at least 1 number.
$ ./pwcheck.sh
Please enter password :
A
Weak Password! It should include at least 10 characters.
Weak Password! It should include at least 1 lower case letter.
Weak Password! It should include at least 1 number.