Hola.
Antes de nada, sabrás que hay bastantes generadores de diccionarios que hacen eso mismo que pides (crunch, por ejemplo...).
Si tienes interés por hacerlo en bash o C, creo que más o menos te puedo ayudar.
Por ejemplo, en bash podríamos hacer algo así de sencillo:
#!/bin/bash
trap captura_interrupcion INT SIGINT SIGTERM ABRT HUP TERM QUIT
captura_interrupcion()
{
echo
echo "Generador detenido por el usuario"
exit
}
uso()
{
echo "Uso: $0 [opciones]"
echo " Lista de opciones:"
echo " -h, muestra esta ayuda"
echo " -n, numero de caracteres de cada palabra"
echo " -c, caracteres a usar, separados por espacios y entre comillas"
echo " -x, caracteres hexadecimales"
echo " -i, numeros enteros"
}
numCaracteres=14
charset=( {a..z} {A..Z} {0..9} )
while getopts "hxin:c:" opcion
do
case $opcion in
h)
uso
exit
;;
x)
charset=( {a..f} {A..F} {0..9} )
;;
i)
charset=( {0..9} )
;;
n)
numCaracteres=$OPTARG
;;
c)
unset charset
for i in $OPTARG
do
charset[${#charset[*]}]=$i
done
;;
?)
echo "opcion $OPTARG no reconocida"
;;
:)
echo "opcion $OPTARG requiere un argumento"
;;
esac
done
shift $(($OPTIND - 1))
longcharset=${#charset[*]}
while (true)
do
palabra=""
for i in `seq 1 $numCaracteres`
do
palabra=$palabra${charset[$(($RANDOM%$longcharset))]}
done
echo $palabra
done
Espero que no tenga errores...
Por defecto genera palabras de 14 caracteres aleatorios.
Con -i solo genera números, con -x solo caracteres hexadecimales, y con -c defines tú los caracteres a utilizar.
En cualquier momento se puede cancelar con Ctrl + c
Uso:
$ ./random.sh -h
Uso: ./random.sh [opciones]
Lista de opciones:
-h, muestra esta ayuda
-n, numero de caracteres de cada palabra
-c, caracteres a usar, separados por espacios y entre comillas
-x, caracteres hexadecimales
-i, numeros enteros
Ejemplo, charset a, b, c, d, e, f, g y número de caracteres=5
$ ./random.sh -n 5 -c "a b c d e f g"
dgffb
abeed
fgdcb
gaacg
dacda
aebfc
fddac
También podría añadirse la opción -s, para que genere las palabras secuencialmente, es decir:
aaaa
aaab
aaac
aaad
aaba
aabb
aabc
etc...
Pero eso lo dejo para otro momento, o para algún voluntario.
PD: si necesitas que comente el código, o explique alguna parte, házmelo saber.