我尝试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