Я довольно долго обдумываю это. Эта программа проверки пароля гарантирует, что данный пароль включает в себя:
Оба верхних и нижних регистрах Не менее 10 цифр По меньшей мере одно числоКод работает почти отлично, за исключением капитала буквы. Когда в качестве пароля вставлен один капитал, программа меняет значение флагпапки, а оно не должно. Может ли кто-нибудь помочь?
#!/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 locale 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
Регулярные выражения, как правило, дают вам больше возможностей управления и возможностей с помощью сопоставления и проверки. Вы можете, фактически, сконденсировать весь этот сценарий в одно регулярное выражение, если хотите (хотя вы потеряете многословие).
Образец:
$ ./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.
Когда вы работаете с диапазонами символов, очень хорошая идея вставить 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 locale 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
Регулярные выражения, как правило, дают вам больше возможностей управления и возможностей с помощью сопоставления и проверки. Вы можете, фактически, сконденсировать весь этот сценарий в одно регулярное выражение, если хотите (хотя вы потеряете многословие).
Образец:
$ ./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.