como misturar caracteres de strings no bash?

2

Eu tenho este script onde ele gera senha aleatória, mas precisa ser embaralhado. Eu não consegui encontrar uma maneira de fazer isso. Por favor me ajude.

num=("0" "1" "2" "3" "4" "5" "7" "8" "9")
special=("@" "#" "$" "%" "*" "-" "+")
upper=(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)
lower=(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)
lower2=${#lower[*]}   #${lower[$((RANDOM%lower2))]}
upper2=${#upper[*]}   #${upper[$((RANDOM%upper2))]}
num2=${#num[*]}     #${num[$((RANDOM%num2))]}
special2=${#special[*]} #${special[$((RANDOM%special2))]}
echo "${special[$((RANDOM%special2))]}${num[$((RANDOM%num2))]}${lower[$((RANDOM%lower2))]}${upper[$((RANDOM%upper2))]}${lower[$((RANDOM%lower2))]}${upper[$((RANDOM%upper2))]}${lower[$((RANDOM%lower2))]}${upper[$((RANDOM%upper2))]}"

esta é a saída: @7nOyIaJ  como faço para randomizar isso?

    
por user3395201 03.10.2014 / 01:14

3 respostas

8

Eu estou supondo que você quer que seja randomizado a partir do sentido de que "especial" é sempre o primeiro. Aqui está um jeito hacker gigante que faz isso. OBSERVAÇÃO: Seu script é scr.bash .

$ echo $(./scr.bash | fold -w1 | shuf | tr -d '\n')

Exemplos

$ echo $(./scr.bash | fold -w1 | shuf | tr -d '\n')
qT*Jyv8Y

$ echo $(./scr.bash | fold -w1 | shuf | tr -d '\n')
QbOvX3n-

$ echo $(./scr.bash | fold -w1 | shuf | tr -d '\n')
*Q5nGgIt

Isso é difícil, mas mostra a abordagem.

Detalhes

O comando fold dividirá a saída em 1 caractere por linha. Existem outras maneiras de fazer isso, mas optei por fold . O comando shuf pode "embaralhar" as linhas em uma ordem aleatória. O comando tr excluirá os caracteres de nova linha ( \n ) da dobra inicial que fizemos.

    
por 03.10.2014 / 01:44
2

A resposta dada pelo @slm faz bom uso das ferramentas disponíveis no shell, mas quando combinadas com o seu '' scr.bash 'é um pouco complicado. Se você tem Python (versão 2.7 ou 3.x), aqui está um script que faz o mesmo trabalho de forma mais legível:

#!/usr/bin/env python
"""
Create a formulaic but reasonably strong password.
"""

import random

def shuffled_password():
    """Using one random member of special and num and three members each
       from upper and lower return a shuffled string of their concatenation.
    """
    num = list('012345789')
    special = list('@#$%*-+')
    upper = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
    lower = list('abcdefghijklmnopqrstuvwxyz')
    random.shuffle(num)
    random.shuffle(special)
    random.shuffle(upper)
    random.shuffle(lower)

    letters = [special[0], num[0]]
    letters.extend(lower[0:3] + upper[0:3])
    random.shuffle(letters)
    s = ''.join(letters)  # funny way to turn list of chars into string
    return s

if __name__ == '__main__':
    print(shuffled_password())

Eu escrevi este código no curso de explorar a complexidade combinatória de seu método. Alguém acima mencionou o uso de pwgen ; Inicialmente pensei que deveria ser mais strong que o seu método de homebrew, mas meu palpite estava errado.

Seu método, mesmo sem o shuffle(letters) , produz 21 bilhões de combinações. Isso produz uma entropia estimada de 39 bits. Isso recebe uma classificação informal do Teste de Força de:

36 - 59 bits = Reasonable; fairly secure passwords for network and company passwords

Adicionando o shuffle final adiciona cerca de 5 bits de entropia para a mistura. Para referência,

pwgen --symbols --numerals

produz senhas com entropia estimada de 37 bits. Eu atribuo isso à tentativa do pwgen de produzir senhas "memorizáveis" que reduz o conjunto de saída de alguma forma. Isso ainda é "Razoável" de acordo com as categorias do Teste de Força.

Advertência: minha matemática combinatória, particularmente em permutações multiset é limitada, correções são bem-vindas.

    
por 03.10.2014 / 05:34
0

Parece que pode ser simplificado ...

$ echo {A..Z} {a..z} {0..9} {0..9} '!@#$%^&*()_+=-' | tr ' ' "\n" | shuf | xargs | tr -d ' ' | cut -b 1-18
WhBypH7Pvmtow60D11

Eu adicionei dígitos duas vezes para garantir que eles fossem adicionados a uma senha.

E com símbolos:

$ echo {A..Z} {a..z} {0..9} {0..9} '! @ # % ^ & * ( ) _ + = - [ ] { } " < > . / ?' | tr ' ' "\n" | shuf | xargs | tr -d ' ' | cut -b 1-18
*p6-3XbEBAJL}%>t2U
    
por 20.11.2016 / 23:33

Tags