Программа проверки пароля

Я довольно долго обдумываю это. Эта программа проверки пароля гарантирует, что данный пароль включает в себя:

Оба верхних и нижних регистрах Не менее 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
3
задан 16 November 2017 в 03:31

4 ответа

Когда вы работаете с диапазонами символов, очень хорошая идея вставить 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 символы локали сортируются строго в соответствии с их кодовой точкой.

9
ответ дан 18 July 2018 в 03:13

Во-первых, вам не нужно много разветвлений 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.
9
ответ дан 18 July 2018 в 03:13

Когда вы работаете с диапазонами символов, очень хорошая идея вставить 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 символы локали сортируются строго в соответствии с их кодовой точкой.

9
ответ дан 24 July 2018 в 17:47

Во-первых, вам не нужно много разветвлений 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.
9
ответ дан 24 July 2018 в 17:47

Другие вопросы по тегам:

Похожие вопросы: