Cómo crear una contraseña compleja aleatoria en SuSe 12

Cómo crear una contraseña compleja aleatoria en SuSe 12

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 shufy 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' )

información relacionada