Preciso de uma maneira de gerar uma senha aleatória seguindo estes requisitos:
- Senha com pelo menos 9 caracteres
- pelo menos 2 letras maiúsculas
- pelo menos 2 letras minúsculas
- pelo menos 2 dígitos
- pelo menos 2 caracteres especiais
- deve começar com uma letra
este é o comando que eu tenho:
{ shuf -r -n4 -e {A..Z}; shuf -r -n4 -e {a..z}; shuf -r -n4 -e {0..9}; } | shuf | tr -d $'\n'
mas está faltando os caracteres especiais
O sistema operacional é SuSE 12
Responder1
Você pode adicionar caracteres especiais com outro shuf
, mas não pode usar expansão de chaves e intervalos como esse.
Mas você poderia listá-los explicitamente, um por um, entre aspas para protegê-los do shell:
shuf -r -n2 -e '!' '"' '#' '$' % '&' '(' ')' '*' + , - . / : ';' '<' = '>' '?' @ '[' '\' ']' '^' _ '{' '|' '}'
Ou coloque-os em uma string e use a divisão de palavras para colocá-los em vários argumentos. É necessário desabilitar o globbing com set -f
, caso contrário o asterisco causará problemas:
set -f
shuf -r -n2 -e $(sed -e 's/./& /g' <<< '!"#$%&()*+,-./:;<=>?@[\]^_{|}' )
(ou apenas faça o que todo mundo faz e adicione dois caracteres especiais fixos no final de uma senha que de outra forma seria sensata e longa o suficiente, mesmo sem eles.)
Para garantir que você tenha uma letra como primeiro caractere, é mais fácil apenas adicionar uma separadamente e embaralhar os caracteres apenas do restante da senha. Por exemplo, isso criaria a senha em duas partes, sendo a primeira uma única letra (maiúscula ou minúscula), a segunda é o que você tinha nos comentários:
#!/bin/bash
set -f
pw=$(shuf -r -n1 -e {A..Z} {a..z})
pw="$pw$( { shuf -r -n4 -e {A..Z}; shuf -r -n4 -e {a..z}; shuf -r -n4 -e {0..9}; shuf -r -n2 -e $(sed -e 's/./& /g' <<< '@%+\/!#$^?:.(){}[]-_.'); } | shuf | tr -d '\n' )"
echo "$pw"
A saída seria algo assim:
$ bash pw.sh
WRgpJ7pP%Tj60.1
$ bash pw.sh
oV6N#7s4Po3Bt)r
Responder2
Dê uma olhadaComo gerar uma string aleatória?
Herbert propõe usar/dev/urandom
tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' </dev/urandom | head -c 13 ; echo
400 a Cat oferece solução comopenssl
openssl rand -base64 12
O problema é que nenhuma dessas soluções garante que você terá todos os caracteres (ou seja, 2 dígitos, 2 caracteres especiais etc.) que deseja.
Com shuf
e com base no seu código original, você pode fazer algo como
shuf -r -n1 -e {a..z} {A..Z} | tr -d $'\n'; { shuf -r -n2 -e {0..9}; shuf -r -n2 -e {a..z}; shuf -r -n2 -e {A..Z}; shuf -r -n2 -e { \! \" \# $ % \& '\' '/' \( \) \{ \} [ ] \< \> + - = . , : \; ? @ \| \` \~ ^ _ "'" \* }; } | shuf | tr -d $'\n'
Dividido em linhas para facilitar a leitura:
shuf -r -n1 -e {a..z} {A..Z} | tr -d $'\n';
{ shuf -r -n2 -e {0..9};
shuf -r -n2 -e {a..z};
shuf -r -n2 -e {A..Z};
shuf -r -n2 -e { \! \" \# $ % \& '\' '/' \( \) \{ \} [ ] \< \> + - = . , : \; ? @ \| \` \~ ^ _ "'" \* }; } | shuf | tr -d $'\n'
O que produzirá uma string começando com uma letra (observe que não estou canalizando a primeira linha para last shuf
) e terá 2 letras minúsculas, 2 letras maiúsculas e 2 dígitos (um total de 9 caracteres)
Responder3
No final, este é o comando final:
export PASSWORD=$(shuf -r -n1 -e {A..Z} {a..z})$( { shuf -r -n4 -e {A..Z}; shuf -r -n4 -e {a..z}; shuf -r -n4 -e {0..9}; shuf -r -n2 -e $(sed -e 's/./& /g' <<< '@%+\/!#$^?:.(){}[]-_.'); } | shuf | tr -d '\n' )