Necesito una forma de generar una contraseña aleatoria siguiendo estos requisitos:
- Contraseña de al menos 9 caracteres
- al menos 2 letras mayúsculas
- al menos 2 letras minúsculas
- al menos 2 dígitos
- al menos 2 caracteres especiales
- debe comenzar con una letra
este es el comando que tengo:
{ shuf -r -n4 -e {A..Z}; shuf -r -n4 -e {a..z}; shuf -r -n4 -e {0..9}; } | shuf | tr -d $'\n'
pero le faltan los caracteres especiales
El sistema operativo es SuSE 12
Respuesta1
Podrías agregar los caracteres especiales con otro shuf
, pero no puedes usar expansión de llaves y rangos como ese.
Pero podrías enumerarlos explícitamente, uno por uno, citados para protegerlos del shell:
shuf -r -n2 -e '!' '"' '#' '$' % '&' '(' ')' '*' + , - . / : ';' '<' = '>' '?' @ '[' '\' ']' '^' _ '{' '|' '}'
O colóquelos en una cadena y use la división de palabras para incluirlos en múltiples argumentos. Sin embargo, es necesario desactivar el globbing con set -f
; de lo contrario, el asterisco causará problemas:
set -f
shuf -r -n2 -e $(sed -e 's/./& /g' <<< '!"#$%&()*+,-./:;<=>?@[\]^_{|}' )
(o simplemente haga lo que todos hacen y agregue dos caracteres especiales fijos al final de una contraseña que de otro modo sería sensata y que sea lo suficientemente larga incluso sin ellos).
Para asegurarse de tener una letra como primer carácter, es más fácil agregar una por separado y mezclar los caracteres solo del resto de la contraseña. Por ejemplo, esto construiría la contraseña en dos partes, la primera sería una sola letra (mayúscula o minúscula), la segunda es la que tenía en los comentarios:
#!/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"
La salida sería algo como esto:
$ bash pw.sh
WRgpJ7pP%Tj60.1
$ bash pw.sh
oV6N#7s4Po3Bt)r
Respuesta2
Echa un vistazo a¿Cómo generar una cadena aleatoria?
herbert propone usar/dev/urandom
tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' </dev/urandom | head -c 13 ; echo
400 el Cat ofrece solución conopenssl
openssl rand -base64 12
El problema es que ninguna de esas soluciones garantiza que tendrá todos los caracteres (es decir, 2 dígitos, 2 caracteres especiales, etc.) que desea.
Con shuf
y basándose en su código original, puede hacer 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 en líneas para facilitar la lectura:
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'
Lo que producirá una cadena que comienza con una letra (tenga en cuenta que no estoy interconectando la primera línea con la última shuf
) y tendrá 2 letras minúsculas, 2 letras mayúsculas y 2 dígitos (un total de 9 caracteres).
Respuesta3
Al final, este es el 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' )