随机密码生成器Bash

随机密码生成器Bash,bash,passwords,Bash,Passwords,我正在尝试制作一个密码生成器,生成8-16个字符之间的密码。它还必须包含一个数字、大写字母和小写字母,以及在生成字符串时随机放置在字符串中的一个特殊字符 目前,我的代码有时会给我一个不符合要求的密码,例如AOKOKKK@1(无小写字母)此外,我还需要帮助使特殊符号在密码中只出现一次。我怎样才能解决这个问题 这是我的密码: length=$[ 8 +$[RANDOM % 16]] char=(0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p

我正在尝试制作一个密码生成器,生成8-16个字符之间的密码。它还必须包含一个数字、大写字母和小写字母,以及在生成字符串时随机放置在字符串中的一个特殊字符

目前,我的代码有时会给我一个不符合要求的密码,例如
AOKOKKK@1
(无小写字母)此外,我还需要帮助使特殊符号在密码中只出现一次。我怎样才能解决这个问题

这是我的密码:

length=$[ 8 +$[RANDOM % 16]]

char=(0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ! @ \# $ % ^ \&)

max=${#char[*]}
for ((i = 1; i <= $length ; i++))do

let rand=${RANDOM}%${max}
password="${password}${char[$rand]}"
done
echo $password
length=$[8+$[RANDOM%16]]
char=(0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r t u w x y z a b c d e f g i j l m n o p q r t u v w x y z!\\\$^\&)
max=${#char[*]}

对于((i=1;i这保证了一个且仅一个特殊字符,以及至少一个数字、小写和大写。要在密码中随机放置这些字符,
sort-R
用于在打印密码之前对字符顺序进行置乱:

#!/bin/bash
choose() { echo ${1:RANDOM%${#1}:1}; }

{
    choose '!@#$%^\&'
    choose '0123456789'
    choose 'abcdefghijklmnopqrstuvwxyz'
    choose 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    for i in $( seq 1 $(( 4 + RANDOM % 8 )) )
    do
        choose '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    done
} | sort -R | tr -d '\n'
echo ""
工作原理
  • 我们定义了一个便利函数:

    choose() { echo ${1:RANDOM%${#1}:1}; }
    
    choose
    获取一个参数,一个字符串,然后从该字符串中随机选择一个字符

  • 我们每行打印一个字符,每行打印一个所需的字符类型:

    choose '!@#$%^\&'
    choose '0123456789'
    choose 'abcdefghijklmnopqrstuvwxyz'
    choose 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    
  • 我们打印所需的剩余字符数,每行一个字符。这些字符从数字、小写和大写中随机选择:

    for i in $( seq 1 $(( 4 + RANDOM % 8 )) )
    do
        choose '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    done
    
  • 从上面可以看出,特殊字符总是第一位,数字总是第二位,等等。我们需要随机化。我们使用
    排序-R

    sort -R | tr -d '\n'
    
    tr-d'\n'
    用于删除字符之间的换行符,从而在一行上生成字符串

  • 改进 在评论中,JonathanLeffer指出,
    sort-R
    的输出不是完全随机的。
    sort-R
    对每一行的散列进行排序。显然添加了一个随机种子,但每一行都收到相同的种子。为了避免这种情况,下面的版本在每一行上提供了自己的种子。这是通过更改
    choose来实现的功能。最后,
    awk
    用于删除这些数字并显示完整的密码:

    #!/bin/bash
    choose() { echo ${1:RANDOM%${#1}:1} $RANDOM; }
    
    {
        choose '!@#$%^\&'
        choose '0123456789'
        choose 'abcdefghijklmnopqrstuvwxyz'
        choose 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        for i in $( seq 1 $(( 4 + RANDOM % 8 )) )
        do
            choose '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
        done
    
    } | sort -R | awk '{printf "%s",$1}'
    echo ""
    
    awk
    中,每行被划分为多个字段。第一个字段是随机选择的字母,第二个是我们添加到散列种子中的随机数。语句
    printf“%s”,$1
    打印第一个字段(没有尾随空格)忽略第二个字段。最终结果是我们想要的密码

    捕获变量的密码 为了将输出捕获到变量,我们使用命令替换:


    命令替换,用
    $(…)
    表示,在paren中运行命令并捕获它们的标准输出。

    安装在一些linux发行版上(特别是Ubuntu)默认情况下,它也有windows版本。为什么不使用它?

    “一个特殊字符”?为什么?限制可以使用的字符范围的密码系统是无休止的令人沮丧。它们使制作真正好的密码变得非常困难。我同意,但我应该在创建生成器时遵循一条准则分割valid字符分组:小写、大写、数字、特殊字符。确定4个组的随机序列,仅包括特殊字符一次。或者确定“长度1”组的三个主要组的随机序列;然后确定特殊字符在该列表中的随机位置。同时检查每个组是否至少存在一次。然后,针对给定密码长度中的每个字符,从相关组中随机生成一个样本。您需要自己做练习还是需要密码生成器?在Linux中,您可以使用pwgen(
    sudo-apt-get-install-pwgen
    在debian/ubuntu上)整洁,使用带有-R选项的GNU排序扩展。我想知道单字符散列在随机化中的效果如何?尽管手册页上说“按键的随机散列排序”,但对同一数据进行多次排序会产生不同的顺序,因此不仅仅是数据(键)它本身用于生成散列。因此它可能非常合理。[…time passeth…]如果一个字符重复,则随机排序似乎会将所有重复的字符放在一起。请参见
    printf“%s\n”a a b c | sort-R
    @JonathanLeffler好的洞察力!我尝试了它,我看到了同样的事情。我修改了脚本,在排序之前在每行添加一个随机数,然后在排序之后删除该数字。很好的恢复…'t发现这个问题很有趣。我第一次使用
    -R
    的实验使用了所有不同的数字,所以我没有立即发现问题-然后我做得更彻底了一点。@JonathanLeffler我想知道有哪些应用程序的行为是您所期望的功能而不是错误。@user2137454若要将任何脚本的输出捕获为变量,请使用命令替换,如
    myvar=“$(myscript)”另外,我在回答中添加了一个使用命令替换来捕获密码脚本中的输出的例子。主要的原因似乎是这是一个由其他人设置的规则的练习,并且遵循希望的规则的代码< > pWGEN/代码>的可能性约为NIL。欢迎使用堆栈溢出。请考虑解释。我不知道你的答案。
    
    #!/bin/bash
    
    #Password Generator Script
    
    echo "Password Generator Script"
    read -p "Enter the password lenght: " PASS_LENGTH
    for VAR in $(seq 1 3); #how many times password will generate, you can set range
    do
        openssl rand -base64 48 | cut -c1-$PASS_LENGTH
        #-base64(Encode) 48 is length 
        #cut is for user input column -c1 is column1
    done
    
    #!/bin/bash
    
    #Password Generator Script
    
    echo "Password Generator Script"
    read -p "Enter the password lenght: " PASS_LENGTH
    for VAR in $(seq 1 3); #how many times password will generate, you can set range
    do
        openssl rand -base64 48 | cut -c1-$PASS_LENGTH
        #-base64(Encode) 48 is length 
        #cut is for user input column -c1 is column1
    done