Bash正则表达式为强密码

时间:2010-11-18 09:46:11

标签: regex bash input passwords

如何在BASH脚本中使用以下正则表达式?

(?=^.{8,255}$)((?=.*\d)(?!.*\s)(?=.*[A-Z])(?=.*[a-z]))^.*

我需要检查以下用户输入(密码):

  1. 至少一封大写字母。
  2. 至少一个号码。
  3. 至少一封小写字母。
  4. ,密码长度应介于8到255个字符之间。

5 个答案:

答案 0 :(得分:3)

如果您的grep版本具有-P选项,则它支持PCRE(Perl兼容的正则表达式。

grep -P '(?=^.{8,255}$)(?=^[^\s]*$)(?=.*\d)(?=.*[A-Z])(?=.*[a-z])'

我不得不改变你的表达式以拒绝空格,因为它总是失败。额外的括号似乎没有必要。我最后离开了^.*,因为它始终匹配,你真的只需要像这样的布尔结果:

while ! echo "$password" | grep -P ...
do
    read -r -s -p "Please enter a password: " password
done

答案 1 :(得分:1)

我不认为你的正则表达式是检查列表中的东西的最佳(或正确吗?)方式(提示:我会独立于其他条件检查长度),但要回答关于在Bash中使用它的问题:使用grep -Eq的返回值,例如:

if echo "$candidate_password" | grep -Eq "$strong_pw_regex"; then
    echo strong
else
    echo weak
fi

或者在Bash 3及更高版本中,您可以使用=~运算符:

if [[ "$candidate_password" =~ "$strong_pw_regex" ]]; then
    …
fi

grep -E或Bash的regexp语法不一定支持您在示例中使用的所有内容,但可以使用其中任何一种来检查您的要求。但是如果你想要更漂亮的正则表达式,你可能需要用Ruby或Perl代替Bash。

至于修改正则表达式,请使用Bash检查长度(${#candidate_password}为您提供变量candidate_password中字符串的长度),然后使用不带前瞻的简单语法。为简单起见,您甚至可以使用单独的正则表达式检查所有三个条件。

答案 2 :(得分:0)

grep选项的

-E使用扩展正则表达式(ERE)
从此documentation ERE不支持预测。

所以你可以将Perl用作:

perl -ne 'exit 1 if(/(?=^.{8,255}$)((?=.*\\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.*/);exit 0;'

Ideone Link

答案 3 :(得分:0)

我知道您正在寻找正则表达式,但您是否考虑通过PAM模块进行此操作?

可能还有其他有趣的模块。

答案 4 :(得分:0)

这些匹配与逻辑AND运算符相关联,这意味着唯一的匹配就是当它们全部匹配时。 因此,最简单的方法是匹配链接的那些条件,将先前的结果传送到下一个表达式。然后,如果任何匹配失败,则整个表达式失败:

$echo "tEsTstr1ng" | egrep "^.{8,255}"| egrep "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"| egrep "[abcdefghijklmnopqrstuvwxyz"] | egrep "[0-9]"

我手动输入了所有字符而不是“[AZ]”和“[az]”,因为不同的系统区域设置可能会将它们替换为[aAbBcC ...,这是一场比赛中的两个条件,我们需要检查两个条件。

作为shell脚本:

#!/bin/sh
a="tEsTstr1ng"
b=`echo $a | egrep "^.{8,255}" | \
             egrep "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]" | \
             egrep "[abcdefghijklmnopqrstuvwxyz"] | \
             egrep "[0-9]"`
# now featuring W in the alphabet string
#if the result string is empty, one of the conditions has failed
if [ -z $b ]
  then
    echo "Conditions do not match"
  else
    echo "Conditions match"
fi