【问题标题】:Regex password validation in Bash shellBash shell 中的正则表达式密码验证
【发布时间】:2013-12-30 18:44:47
【问题描述】:

我在 Bash Shell 脚本中使用正则表达式。我正在使用下面的正则表达式代码来检查密码标准:密码至少应包含 6 个字符,至少包含一位数字和至少一个大写字母。我在正则表达式验证工具中进行了验证,我形成的正则表达式工作正常。但是,它在 Bash Shell 脚本中失败了。请提供您的想法。

echo "Please enter password for User to be created in OIM: "
echo "******Please Note: Password should be at least 6 characters long with one digit and one Upper case Alphabet******"
read user_passwd
regex="^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)\S{6,}$"
echo $user_passwd
echo $regex
if [[ $user_passwd =~ $regex ]]; then
    echolog "Password Matches the criteria"
else
    echo "Password criteria: Password should be at least 6 characters long with one digit and one Upper case Alphabet"
    echo "Password does not Match the criteria, exiting..."
    exit
fi

【问题讨论】:

  • 单个正则表达式不一定是此类问题的最佳解决方案。从anubhava's answer可以看出,一系列直接对应你需求的测试可以更简单,更容易维护。
  • 您的正则表达式检查至少一个小写字母,但您没有在问题中提及该要求。

标签: bash


【解决方案1】:

我要补充 anubhava 的答案。他的支票对我有用,但并不完全。 例如“hello123”或“HELLO123”也通过了检查,所以没有检测到大小写。 问题在于语言环境设置,更具体地说是LC_COLLATE 变量。它需要设置为“C”以考虑大小写。 但更好的解决方案是使用字符类而不是范围表达式。 here的解释帮助我解决了我的问题。最终使用字符类对我有用。

[[ ${#s} -ge 6 && "$s" == *[[:lower:]]* && "$s" == *[[:upper:]]* && "$s" == *[0-9]* ]]

【讨论】:

    【解决方案2】:

    BASH 正则表达式引擎不支持您的正则表达式中的环视。

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

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

    它将确保输入字符串$s满足所有这些条件:

    • 至少 6 个字符
    • 至少有一位数字
    • 至少有一个大写字母
    • 至少有一个小写字母

    【讨论】:

    • 为了清楚起见,我会写>= 6 而不是> 5。顺便说一句,这个问题没有提到至少一个小写字母的要求。
    • 是的>= 6 更好。我看到 OP 的正则表达式 "^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)\S{6,}$" 也在检查小写字符。
    • 在我的测试中,123AsaA123AsaA 都是有效密码。
    • 您好 Anubhava,非常感谢您的回答。在这里对我来说是新的学习。我在这里有一个疑问(希望我听起来不要太笨)我输入了输入范围,即输入的长度(范围从 6-12),上面的代码在输入长度之间工作 6-10 但在 10 之后,控制移动到其他条件并失败。请让我知道是否有任何具体原因?提供的输入:成功:aas12A AsaA123 123AssaA AAAsss123 失败:aaaSSSAAA1 aaaSSSAAA112
    • 好的,您能否发布您在问题中尝试过的代码,然后我当然可以对其进行测试并相应地建议您。
    猜你喜欢
    • 2011-05-06
    • 2016-10-19
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多