密码不应该是用户名脚本的一部分

时间:2017-08-26 17:02:33

标签: bash if-statement typechecking

我正在创建一个以注册形式接受用户输入的脚本。一切都已设置我只是想在这里添加一个功能。我想禁止用户使用属于其用户名的密码。我想请求帮助制定脚本,但这就是我现在所拥有的。

假设“用户名”和“密码”都是变量

passcheck=$(echo "*$username*")
if ($username = $passcheck)
then
echo "You can't use a password with your username in it!" 
else
echo "ok"

我想在这里实现的是,只要整个用户名的任何部分都被用作密码,尽管在之后或之前有数字或符号,这将是不可接受的

输入无效的示例:

username=gifter
password=gifter100!

无效输入的另一个例子:

username=doctor
password=thegooddoctor100!

有效输入的示例:

username=starbucks
password=star100bucks!

3 个答案:

答案 0 :(得分:2)

案例陈述适用于此并且与POSIX兼容:

case "$password" in
    *$username*) echo "You can't use a password with your username in it!" ;;
    *) echo "OK" ;;
esac

答案 1 :(得分:1)

您可以使用bash测试运算符和glob字符串检查来解决您的问题。将较长的字符串保留在等式检查运算符==的左侧,在您的情况下为password变量。

if [[ "$password" == *"$username"* ]]; then
    printf "You cannot use password with an username in it\n"
fi

只是要添加注释,if ($username = $passcheck)不是bash中的有效操作,它会在脚本中引发语法错误。将来,在发布此处之前,请使用shellcheck粘贴脚本并修复语法问题。

答案 2 :(得分:1)

到目前为止,其他答案只捕获包含整个用户名的密码,而不是包含部分用户名的密码。检查部分匹配是棘手的,但一种方法是从密码中删除前导和尾随数字和标点符号,然后查看用户名是否包含:

trimmedpw="$(printf '%s\n' "$password" | sed 's/^[[:digit:][:punct:]]*//; s/[[:digit:][:punct:]]*$//')"

if [ -z "$trimmedpw" ]; then
        echo "You can't use a password with just digits and/or punctuation!"
else
    case "$username" in
        *"$trimmedpw"* )
            echo "You can't use a password with part of your username in it!" ;;
        * )
            echo "ok" ;;
    esac
fi

有了这个,用户名=" gifter",密码=" 20gift20!"将被视为无效。但是用户名="医生",密码=" thegooddoctor100!"被认为是有效的,因为它不仅仅是用户名之前的数字和标点符号!如果您希望它无效,您还必须为密码中包含的整个用户名单独测试。

请注意,检查用户名的任何部分是否与密码的任何部分匹配是不合理的,因为如果它们包含任何共同的字符,则禁止它们。我想你可以做一些像禁止它们包含3个字符长(或更长)的匹配部分......

相关问题