生成至少包含 2 个数字、2 个大写字母、1 个符号、x 个小字母且最大长度为 16 的密码

生成至少包含 2 个数字、2 个大写字母、1 个符号、x 个小字母且最大长度为 16 的密码

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

相关内容