我正在创建一个以注册形式接受用户输入的脚本。一切都已设置我只是想在这里添加一个功能。我想禁止用户使用属于其用户名的密码。我想请求帮助制定脚本,但这就是我现在所拥有的。
假设“用户名”和“密码”都是变量
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!
答案 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个字符长(或更长)的匹配部分......