密码不应是用户名脚本的一部分
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 个字符长(或更长)的部分...
我正在创建一个脚本,它可以接受用户以注册形式输入的内容。一切都已设置好,我只想在这里添加一点功能。我想禁止用户使用作为其用户名一部分的密码。我想寻求帮助来为它制定脚本,但这就是我现在所拥有的。
假设"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 个字符长(或更长)的部分...