在bash脚本中使用密码验证似乎让我在工作中迷惑

时间:2014-02-12 08:57:17

标签: regex linux bash validation passwords

我创建了简单的脚本,用于验证以下条件的密码

  1. 密码长度必须等于或大于8。

  2. 密码可选地包含a-z,A-z,0-9表示用户仅通过char设置密码,仅用数字或混合字符和数字。

  3. 此外,用户可以在密码中混合使用#,$,+,*等字符。

  4. 所以下面的密码应该匹配

    ptr*1$#+22A
    111111111BB
    password123
    

    但如果用户传递的字符不符合以下密码,则拒绝接受。

     ptr*1$#+22A: //because ":" at the end of string which not in criteria 
    

    我的脚本如下

    #! /bin/bash
    
    password="ptr*1$#+22A"
    
    if [[ ${#password} -ge 8 && "$password" || *[A-Z]* || "$password" || *[a-z]* || "$password" || *[0-9]* && "$password" || *[*$#+]* ]]
    then
        echo "pass"
    else
        echo "fail"
    fi
    

    它正在用于匹配密码,但它也传递了密码ptr*1$#+22A:,它必须拒绝。

    如果&&任何一个语句为真,则脚本中的问题是条件为真。我已经通过&&代替||尝试了此脚本,但它要求密码必须包含至少一个 符合标准的char,这不是我的要求。

    所以任何人都知道如何验证我的密码,以便它符合我的标准吗?

1 个答案:

答案 0 :(得分:3)

可以将逻辑转换为单个正则表达式,该表达式仅允许您希望允许的那些字符,并且至少需要八个字符(我假设您可能需要将长度限制为可以存储在数据库字段中的任何字符,但你没有指明)

您的模式应如下所示:

^[A-Za-z0-9#$+*]{8,}$

这将创建一个由合法字符组成的字符类,并量化需要多少个这样的字符;至少八个。它锚定到字符串的开头和结尾,因此字符串必须只包含从开始到结束的那些字符。

如果您还需要设置最大长度,可以在逗号之后放置在量词中。