Cada vez que solicitan la creación de un nuevo usuario en un sistema, suele surgir la necesidad de crear una nueva contraseña. Como buenos sysadmins que somos, debemos crear contraseñas fuertes, preferentemente aleatorias, que incluyan letras, números y símbolos. El problema es que a veces estamos faltos de inspiración, entonces qué mejor que dejar que un simple comando lo haga por nosotros.

Incluso, en determinados sistemas *nix, puede ser necesario crear usuarios en modo batch, lo que hace que la creación de contraseñas sea un problema más grande que una simple cuestión de inspiración. Es decir, podría ser necesario crear usuarios y asignar contraseñas de forma automática desde un script.

Manos a la obra

Con el fin de crear contraseñas aleatorias de ancho fijo, será necesario valerse de la utilidad tr y el dispositivo random.

El comando tr provee la funcionalidad necesaria para realizar traducciones a nivel caracter. Copia la entrada estándar a la salida estándar sustituyendo o eliminando caracteres.

man tr

El dispositivo random (/dev/random, /dev/urandom) retorna una provisión interminable de bytes aleatorios.

man 4 random

Para generar una contraseña aleatoria utilizando estas herramientas, basta con leer bytes del dispositivo random (ya que un caracter ocupa exactamente un byte en codificación ASCII). Aunque es necesario obtener sólo caracteres imprimibles o, mejor aún, un subconjunto específico de caracteres, por ejemplo letras minúsculas, mayúsculas y números.

Entonces, se puede recurrir a tr para "filtrar" los caracteres que va retornando el dispositivo random. Armar el comando de la siguiente manera: leer bytes desde el dispositivo random en la entrada estándar de tr; filtrar para quedarse sólo con los caracteres dentro de un subconjunto específico; y finalmente leer la cantidad deseada (por ejemplo 6, 8, ó 10) utilizando head:

[emi@hal9000 ~]$ tr -dc a-z < /dev/random | head -c 6; echo       
jqlkhf

Mediante las opciones d y c se le indica a tr que elimine (d) aquellos caracteres que no pertenecen (c) al conjunto especificado (de la 'a' a la 'z' en el ejemplo).

Agregué intencionalmente un echo al final de comandos para que inserte un salto de línea (para que el prompt de la shell quede en la próxima línea).

Ahora bien, si deseamos incluir las letras mayúsculas, basta con agregar el subconjunto A-Z:

[emi@hal9000 ~]$ tr -dc a-zA-Z < /dev/random | head -c 6; echo 
LTgklj

De igual forma para los números:

[emi@hal9000 ~]$ tr -dc a-zA-Z0-9 < /dev/random | head -c 8; echo 
plfEtO3L

Sin embargo, para mejorar la fortaleza de las contraseñas, es recomendable agregar algunos símbolos y caracteres especiales como punto, signo de exclamación, símbolo pesos, etc:

[emi@hal9000 ~]$ tr -dc 'a-zA-Z0-9.!\$' < /dev/random | head -c 8; echo
ajAnCD$N
[emi@hal9000 ~]$ tr -dc 'a-zA-Z0-9.!\$' < /dev/random | head -c 8; echo
1Qc.Rgne

Notar que ahora es necesario encerrar la declaración del subconjunto entre comillas simples y escapar los caracteres especiales para que no sean interpretados por la shell.

Por último, si fuese necesario guardar la contraseña generada dentro de una variable, es posible hacerlo de la siguiente forma:

En Bash
[emi@hal9000 ~]$ VAR1=$(tr -dc 'a-zA-Z0-9.!\$' < /dev/random | head -c 8)
[emi@hal9000 ~]$ echo $VAR1
[emi@hal9000 ~]$ VAR1=$(tr -dc 'a-zA-Z0-9.!\$' < /dev/random | head -c 8)
[emi@hal9000 ~]$ echo $VAR1
OXsbGDy$
[emi@hal9000 ~]$ VAR1=$(tr -dc 'a-zA-Z0-9.!\$' < /dev/random | head -c 8)
[emi@hal9000 ~]$ echo $VAR1
kfI3q0cx
En csh
emi@hal9000:~ % set VAR1=`tr -dc 'a-zA-Z0-9.!\$' < /dev/random | head -c 8`
emi@hal9000:~ % echo $VAR1
5RlFRHMW
emi@hal9000:~ % set VAR1=`tr -dc 'a-zA-Z0-9.!\$' < /dev/random | head -c 8`
emi@hal9000:~ % echo $VAR1
8Ajo1WW.
emi@hal9000:~ % set VAR1=`tr -dc 'a-zA-Z0-9.!\$' < /dev/random | head -c 8`
emi@hal9000:~ % echo $VAR1
z!EHyjLF


Tal vez pueda interesarte


Compartí este artículo