![生成至少包含 2 个数字、2 个大写字母、1 个符号、x 个小字母且最大长度为 16 的密码](https://linux22.com/image/176310/%E7%94%9F%E6%88%90%E8%87%B3%E5%B0%91%E5%8C%85%E5%90%AB%202%20%E4%B8%AA%E6%95%B0%E5%AD%97%E3%80%812%20%E4%B8%AA%E5%A4%A7%E5%86%99%E5%AD%97%E6%AF%8D%E3%80%811%20%E4%B8%AA%E7%AC%A6%E5%8F%B7%E3%80%81x%20%E4%B8%AA%E5%B0%8F%E5%AD%97%E6%AF%8D%E4%B8%94%E6%9C%80%E5%A4%A7%E9%95%BF%E5%BA%A6%E4%B8%BA%2016%20%E7%9A%84%E5%AF%86%E7%A0%81.png)
我尝试pwgen
生成makepasswd
密码...
但这些不足以生成精确的文字和数字计数...
pwgen -c -n -y -B 12 1
这没有按预期工作,因为我无法定义最小数字计数...
我想定义每种类型的文字中允许的最小和最大字符...
是否crunch
有此功能?
你还有其他建议的工具吗?
最受欢迎的 shell 脚本...(使用正则表达式)
提前致谢
答案1
只需运行它直到它起作用(在支持 for regex 匹配的较新版本的 bash 中=~
):
unset pass;
until [[ \
$pass =~ [0-9].*[0-9] &&
$pass =~ [A-Z].*[A-Z] &&
$pass =~ [^A-Za-z0-9] \
]]; do
pass=$(LC_ALL=C pwgen -c -n -y -B 12 1)
done
例如:
$ unset pass; until [[ $pass =~ [0-9].*[0-9] && $pass =~ [A-Z].*[A-Z] && $pass =~ [^A-Za-z0-9] ]]; do pass=$(LC_ALL=C pwgen -c -n -y -B 12 1); done; echo $pass
AhP4eej3bie#
请注意,我将“符号”定义为“不是字母也不是数字”。如果您愿意,可以选择更具限制性的内容。
如果您的 shell 不支持正则表达式匹配,请尝试:
$ perl -le 'until ($pass =~ /\d.*\d/ && $pass =~ /[A-Z].*[A-Z]/ && $pass =~ /[^A-Za-z0-9]/){chomp($pass=`LC_ALL=C pwgen -c -n -y -B 12 1`)}; print "$pass"'
iep7EJ-o9ahf
答案2
如果您安装了带有 Perl 模式的 GNU grep,这可以根据限制生成密码。
$ < /dev/urandom \
tr -cd '[:alnum:][:punct:]' | fold -w 12 |
grep -Pm1 '(?=.*[[:upper:]].*[[:upper:]])(?=.*[[:digit:]].*[[:digit:]])(?=.*[[:punct:]])'
A09B?~WR~$#J