[Shell] - Generar una cadena aleatoria
Resuelto
Phiphi57
Mensajes publicados
789
Fecha de registro
Estado
Colaborador
Última intervención
-
faf2019 -
faf2019 -
Hola a todos,
aquí voy, quiero crear contraseñas para usuarios mediante md5, y me gustaría usar un “salt” aleatorio. Por el momento, tengo algo como esto hecho a mano:
mkpasswd --hash=md5 Mot2PasS `uuidgen | awk 'BEGIN{FS="-" } {print $1}'`
sin embargo, uuidgen aparentemente no genera mayúsculas. ¿Existe una única línea de comando que permita generar una cadena aleatoria de 8 caracteres que incluya a..z, A..Z, 0..9? (para info, uuidgen parece usar solo números y minúsculas)
¡Gracias de antemano!
Phiphi
aquí voy, quiero crear contraseñas para usuarios mediante md5, y me gustaría usar un “salt” aleatorio. Por el momento, tengo algo como esto hecho a mano:
mkpasswd --hash=md5 Mot2PasS `uuidgen | awk 'BEGIN{FS="-" } {print $1}'`
sin embargo, uuidgen aparentemente no genera mayúsculas. ¿Existe una única línea de comando que permita generar una cadena aleatoria de 8 caracteres que incluya a..z, A..Z, 0..9? (para info, uuidgen parece usar solo números y minúsculas)
¡Gracias de antemano!
Phiphi
12 respuestas
date +%s | sha256sum | base64 | head -c 8 ; echo
< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-8};echo;
openssl rand -base64 4
< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-8};echo;
openssl rand -base64 4
Re,
en shell
#!/bin/bash
M="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
while ["${n:=1}" -le "8"]; do
pass="$pass${M:$(($RANDOM%${#M})):1}"
let n+=1
done
echo "$pass"
lami20j
en shell
#!/bin/bash
M="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
while ["${n:=1}" -le "8"]; do
pass="$pass${M:$(($RANDOM%${#M})):1}"
let n+=1
done
echo "$pass"
lami20j
Hola,
Pues ya estás aquí "gurú" ahora ;-))
De lo contrario, en Mandriva el "mkpasswd" instalado no es para nada el mismo que en Debian, la prueba :
;-\
De todas formas encontré esto en la Red (en Perl) : http://www.ajs.com/~ajs/mkpasswd.html
:-))
--
Z'@+...che.
Pues ya estás aquí "gurú" ahora ;-))
De lo contrario, en Mandriva el "mkpasswd" instalado no es para nada el mismo que en Debian, la prueba :
[jp@MDK tmpfs]$ mkpasswd EHbb.93nh [jp@MDK tmpfs]$ mkpasswd s7~bVZ0xu [jp@MDK tmpfs]$ mkpasswd -l 8 -C 3 -s 0 BM91hAyg [jp@MDK tmpfs]$Fecha de 1994 :
AUTOR Don Libes, National Institute of Standards and Technology mkpasswd está en dominio público. A NIST y a mí nos gustaría recibir crédito si este programa o partes del mismo son utilizados. 22 de agosto de 1994 MKPASSWD(1)y no maneja el "--hash=" ni el "salt"...
;-\
De todas formas encontré esto en la Red (en Perl) : http://www.ajs.com/~ajs/mkpasswd.html
:-))
--
Z'@+...che.
JP: Zen, mis Nuggets! ;-) El saber no es bueno si no se comparte.
Ver también pwgen (disponible obviamente bajo Debian)
https://sourceforge.net/projects/pwgen/
Johan
--
Gates te dio las ventanas.
GNU nos dio la casa completa. (Alejandrino)
https://sourceforge.net/projects/pwgen/
Johan
--
Gates te dio las ventanas.
GNU nos dio la casa completa. (Alejandrino)
Hola,
Ejemplos
perl -e '@c=("A".."Z","a".."z",0..9);print join("",@c[map{rand @c}(1..8)]),"\n"'El carácter \n solo es para visualización. Ejemplos
$ perl -e '@c=("A".."Z","a".."z",0..9);print join("",@c[map{rand @c}(1..8)]),"\n"' stY7q8Is $ perl -e '@c=("A".."Z","a".."z",0..9);print join("",@c[map{rand @c}(1..8)]),"\n"' DzeO5pmC $ perl -e '@c=("A".."Z","a".."z",0..9);print join("",@c[map{rand @c}(1..8)]),"\n"' lZAdufLs lami20j
Re,
y con mkpasswd
y con mkpasswd
mkpasswd --hash=md5 `perl -e '@c=("A".."Z","a".."z",0..9);print join("",@c[map{rand @c}(1..8)])'`lami20j
¡Hola!
¡Gracias por esta respuesta rápida!!!
me parecía efectivamente haber visto andar este tema con perl (que es un lenguaje que no conocía en absoluto...)
dos pequeñas preguntas subsidiarias mientras estoy aquí:
1-/ ¿existe un equivalente puramente "bash"?
2-/ Pregunta subyacente: ¿perl está instalado por defecto en todo sistema GNU/Linux? (la idea es tener un método básico que funcione seguro para cualquiera, para poder incluirlo quizá en un tutorial...)
Por lo demás, para mis propias necesidades, todo bien, ¡tu solución es perfecta!
Gracias de nuevo!
Phiphi
¡Gracias por esta respuesta rápida!!!
me parecía efectivamente haber visto andar este tema con perl (que es un lenguaje que no conocía en absoluto...)
dos pequeñas preguntas subsidiarias mientras estoy aquí:
1-/ ¿existe un equivalente puramente "bash"?
2-/ Pregunta subyacente: ¿perl está instalado por defecto en todo sistema GNU/Linux? (la idea es tener un método básico que funcione seguro para cualquiera, para poder incluirlo quizá en un tutorial...)
Por lo demás, para mis propias necesidades, todo bien, ¡tu solución es perfecta!
Gracias de nuevo!
Phiphi
Hola,
¿Existe un equivalente puramente "bash"?
Creo que sí. Pero hay que despertar a los maestros jipicy, asevere, jisisv, ... ;)
¿Perl está instalado por defecto en todo OS GNU/Linux?
Sí. Perl está integrado en todo sistema GNU/Linux.
lami20j
¿Existe un equivalente puramente "bash"?
Creo que sí. Pero hay que despertar a los maestros jipicy, asevere, jisisv, ... ;)
¿Perl está instalado por defecto en todo OS GNU/Linux?
Sí. Perl está integrado en todo sistema GNU/Linux.
lami20j
Intento de hacer un script basado en este.
La idea es permitir los siguientes comandos:
Mi código es el siguiente:
Los problemas son los siguientes:
1) ¿Por qué mis dobles espacios se eliminan en la variable syntax
2) *[0-9] reconoce números pero también 3r5
¿Qué sintaxis usar para capturar únicamente combinaciones de dígitos
3) [aA0] reconoce a, A y 0 pero no aA, A0, etc...
¿Qué sintaxis usar para capturar todas las posibles combinaciones de a, A y 0
Gracias por haber presentado este trozo de código que me permite seguir descubriendo más sobre scripts
Santiago
--
Hay 10 tipos de personas en el mundo
Los que entienden el binario y los demás.
La idea es permitir los siguientes comandos:
pwgen [length] [-aA0] length la longitud de la contraseña -a usar minúsculas -A usar mayúsculas -0 usar dígitos
Mi código es el siguiente:
#!/bin/bash # http://www.commentcamarche.net/forum/affich 2335882 shell generer une chaine aleatoire syntax="`basename $0` [length] [-aA0]\n length password length" # Leer parámetros while [ $# -gt 0 ]; do case "$1" in *[0-9]) [ $l ] && (echo -e $syntax; exit 1) l=$1 ;; -[aA0]) ;; *) echo -e $syntax; exit 1 ;; esac shift done # Establecer valor por defecto [ $l ] || l=8 [ $M ] || M="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" while [ "${n:=1}" -le "$l" ] do pass="$pass${M:$(($RANDOM%${#M})):1}" let n+=1 done echo "$pass"
Los problemas son los siguientes:
1) ¿Por qué mis dobles espacios se eliminan en la variable syntax
2) *[0-9] reconoce números pero también 3r5
¿Qué sintaxis usar para capturar únicamente combinaciones de dígitos
3) [aA0] reconoce a, A y 0 pero no aA, A0, etc...
¿Qué sintaxis usar para capturar todas las posibles combinaciones de a, A y 0
Gracias por haber presentado este trozo de código que me permite seguir descubriendo más sobre scripts
Santiago
--
Hay 10 tipos de personas en el mundo
Los que entienden el binario y los demás.
Otro problema más.
Línea 10
En caso de error, la sintaxis se muestra correctamente pero exit 1 no se respeta. El programa continúa.
He reemplazado por
Funciona pero es completamente por casualidad tras muchos intentos.
¿Alguien conoce la sintaxis correcta de un if then en una sola línea?
--
Hay 10 tipos de personas en el mundo
Los que entienden el binario y los demás.
Línea 10
[ $l ] && (echo -e $syntax; exit 1)
En caso de error, la sintaxis se muestra correctamente pero exit 1 no se respeta. El programa continúa.
He reemplazado por
[ $l ] && echo -e $syntax && exit 1
Funciona pero es completamente por casualidad tras muchos intentos.
¿Alguien conoce la sintaxis correcta de un if then en una sola línea?
--
Hay 10 tipos de personas en el mundo
Los que entienden el binario y los demás.
Hola,
1. hay que usar "$syntax"
2. *[0-9] significa cualquier carácter cualquier número de veces seguido de un dígito
si escribes r5 eso no funciona, en cambio si escribes 3r5 el primer carácter es un dígito (pero ojo, no un entero) por lo que 3r5 se mostrará
mira aquí
http://www.commentcamarche.net/faq/sujet 4605 shell tester une variable numerique#expr
3. es mejor usar getopts
aquí hay una prueba
--
lami20j
1. hay que usar "$syntax"
2. *[0-9] significa cualquier carácter cualquier número de veces seguido de un dígito
si escribes r5 eso no funciona, en cambio si escribes 3r5 el primer carácter es un dígito (pero ojo, no un entero) por lo que 3r5 se mostrará
mira aquí
http://www.commentcamarche.net/faq/sujet 4605 shell tester une variable numerique#expr
3. es mejor usar getopts
aquí hay una prueba
lami20j@debian:~$ cat generer_passwd.sh #!/bin/bash syntax="`basename $0` [length] [-aA0]\n length password length" case "$1" in *[0-9]) if let $1 2>/dev/null then echo $1 else echo -e "$syntax" fi ;; *) echo -e "$syntax"; exit 1 ;; esac lami20j@debian:~$ sh generer_passwd.sh 355 355 lami20j@debian:~$ sh generer_passwd.sh 3 3 lami20j@debian:~$ sh generer_passwd.sh 3r generer_passwd.sh [length] [-aA0] length password length lami20j@debian:~$ sh generer_passwd.sh 3r5 generer_passwd.sh [length] [-aA0] length password length lami20j@debian:~$ sh generer_passwd.sh rrr generer_passwd.sh [length] [-aA0] length password length
--
lami20j
Hola,
3. es mejor usar getopts
Ver: http://www.commentcamarche.net/forum/affich 2520040 parametres commencant par un tiret#2
--
Z'@+...che.
3. es mejor usar getopts
Ver: http://www.commentcamarche.net/forum/affich 2520040 parametres commencant par un tiret#2
--
Z'@+...che.
JP : ¡Zen, mis Nuggets! ;-) El saber no es bueno si no se comparte.