[Shell] - Generar una cadena aleatoria

Resuelto
Phiphi57 Mensajes publicados 789 Fecha de registro   Estado Colaborador Última intervención   -  
 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

12 respuestas

faf2019
 
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
7
lami20j Mensajes publicados 21506 Fecha de registro   Estado Moderador, Colaborador de seguridad Última intervención   3 571
 
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
5
jipicy Mensajes publicados 40842 Fecha de registro   Estado Moderador Última intervención   4 898
 
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 :
[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.
0
lami20j Mensajes publicados 21506 Fecha de registro   Estado Moderador, Colaborador de seguridad Última intervención   3 571 > jipicy Mensajes publicados 40842 Fecha de registro   Estado Moderador Última intervención  
 
Hola,

así que tenía razón al pedir despertar a los Maestros

lami20j
0
jisisv Mensajes publicados 3678 Estado Moderador 936
 
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)
2
lami20j Mensajes publicados 21506 Fecha de registro   Estado Moderador, Colaborador de seguridad Última intervención   3 571
 
Hola,

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
0
lami20j Mensajes publicados 21506 Fecha de registro   Estado Moderador, Colaborador de seguridad Última intervención   3 571
 
Re,

y con mkpasswd
mkpasswd --hash=md5 `perl -e '@c=("A".."Z","a".."z",0..9);print join("",@c[map{rand @c}(1..8)])'`
lami20j
0
Phiphi57 Mensajes publicados 789 Fecha de registro   Estado Colaborador Última intervención   295
 
¡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
0
lami20j Mensajes publicados 21506 Fecha de registro   Estado Moderador, Colaborador de seguridad Última intervención   3 571
 
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
0
Phiphi57 Mensajes publicados 789 Fecha de registro   Estado Colaborador Última intervención   295
 
¡Gracias por todo, está perfecto!

Phiphi
0
santiago69 Mensajes publicados 485 Estado Miembro 209
 
Intento de hacer un script basado en este.
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.
0
santiago69 Mensajes publicados 485 Estado Miembro 209
 
Otro problema má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.
0
lami20j Mensajes publicados 21506 Fecha de registro   Estado Moderador, Colaborador de seguridad Última intervención   3 571
 
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@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
0
jipicy Mensajes publicados 40842 Fecha de registro   Estado Moderador Última intervención   4 898
 
Hola,

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.
0