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

Password should not be a part of username script

我正在创建一个脚本,它可以接受用户以注册形式输入的内容。一切都已设置好,我只想在这里添加一点功能。我想禁止用户使用作为其用户名一部分的密码。我想寻求帮助来为它制定脚本,但这就是我现在所拥有的。

假设"username"和"password"都是变量

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!

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

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

补充说明,if ($username = $passcheck) 不是 bash 中的有效操作,这会在您的脚本中引发语法错误。以后,请使用 shellcheck 粘贴您的脚本并修复语法问题,然后再发布到这里。

case 语句适用于此并且 POSIX 兼容:

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

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

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!”将被视为无效。但是 username="doctor", password="thegooddoctor100!" 会被认为是有效的,因为它在用户名之前不仅仅是数字和标点符号!如果您希望它无效,您还必须对密码中包含的整个用户名进行单独测试。

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