Bash Shell帮助正常表达式无法进行密码检查

时间:2015-07-15 04:51:15

标签: regex bash shell

我正在尝试使用我的密码检查程序脚本使正则表达式工作,但由于某种原因它只是不接受它。我想要做的是需要以下字符,最小值: 两个大写字母,两个小写字母,最少2个数字和最少两个特殊字符。我正在寻找的特殊角色只是"!@"就是这样。 这是脚本,

#!/bin/bash
read -s -p "Enter Password: " password
password_length=${#password}
if [ $password_length -lt 8 -o $password_length -gt 20 ] ;then
        echo -e "Invalid password - should be between 8 and 20 characters in length.";
        echo ;
    else
        # Check for invalid characters
        case $password in
            *[^a-zA-Z0-9]* )
                echo -e "Password contains invalid characters.";
                echo ;
                ;;
            * )
                echo "Password accepted.";
                echo;;
        esac
fi

2 个答案:

答案 0 :(得分:0)

BASH正则表达式引擎不像你的正则表达式那样支持外观。

此示例适用于:  密码至少应为6个字符,并且至少有一个数字和至少一个大写字母。

您可以使用以下shell glob检查来确保密码符合您的条件:

[[$ {#s} -ge 6&& " $ S" == [A-Z] && " $ S" == [a-z] && " $ S" == [0-9] ]]

参考:Regex password validation in Bash shell

答案 1 :(得分:0)

我没有一个好的答案。目前我正在使用grep,因为它有一个更强大的正则表达式引擎。

这样的事情:

#!/usr/bin/env bash

while true; do
    echo "Password must contain 2 upper case characters and two numbers"
    read -s -p "Enter Password: " password
    echo

    FAIL=no

    # Mininum 8 characters
    [[ ${#password} -ge 8 ]] || FAIL=yes

    # Must contain 2 upper case letters
    echo $password | grep -q "[A-Z].*[A-Z]" || FAIL=yes

    # Must contain 2 digits
    echo $password | grep -q "[0-9].*[0-9]" || FAIL=yes

    # Must contain one non-alphanumeric character (no spaces)
    echo $password | grep -q "[^a-zA-Z0-9 ]" || FAIL=yes

    [[ ${FAIL} == "no" ]] && break

    echo "Password invalid"
done

echo "Password $password is valid"

无论如何,我要做的是分别针对每个要求测试可能的密码,因为它很容易在正则表达式中丢失,你可能会错过一些边缘情况。