密码检查程序

Aki*_*dis 3 bash scripts

我在这个问题上绞尽脑汁有一段时间了。此密码检查程序可确保给定的密码包括:

  • 大写和小写字母
  • 至少 10 位数字
  • 至少一个数字

除了大写字母外,代码几乎可以正常工作。当插入单个大写作为密码时,程序会更改 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
Run Code Online (Sandbox Code Playgroud)

Kaz*_*lfe 9

首先,你不是需要很多分支if秒。就像,根本。相反,请执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

要解决您的 glob 问题,请改用正则表达式。删除*并使用~.

if [[ "$user_passwd" =~ [A-Z] ]]; then 
    flagcap=1
fi
Run Code Online (Sandbox Code Playgroud)

正则表达式通常通过匹配和验证为您提供更多控制和功能。事实上,如果您愿意,您可以将整个脚本压缩为一个正则表达式(尽管您会失去冗长性)。

样本:

$ ./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.
Run Code Online (Sandbox Code Playgroud)


Ale*_*exP 9

每当您使用字符范围时,最好在脚本的开头插入export LC_ALL=C(或者C.UTF-8如果您需要支持 ASCII 范围之外的字符),否则您可能会对什么A-Za-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
Run Code Online (Sandbox Code Playgroud)

shell 使用范围[A-Z]来表示在当前语言环境之间AZ在当前语言环境中排序的所有字符。在en_US语言环境中,bA和之间排序Z;因此abc匹配*[A-Z]*。另一方面,在C语言环境b中不会在A和之间排序Z,因为在C语言环境中字符严格按照它们的代码点排序。