Générer des mots de passe aléatoires sous Linux
Il y a quelques mois, j'avais présenté une technique pour générer des mots de passe aléatoires sous Linux. Celle-ci présentait un inconvénient : elle était basée sur expect et possédait un script spécial nommé mkpasswd. Voici donc une nouvelle méthode, sans aucune dépendance, qui utilise /dev/urandom pour générer des mots de passe à la volée sous Linux.
Voici un exemple d'utilisation :
< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c8
Quelques explications sur le fonctionnement de cette commande :
- /dev/urandom : c'est l'interface avec le générateur de nombres aléatoires du noyau Linux
- tr -dc _A-Z-a-z-0-9 : indique les caractères à utiliser pour créer le mot de passe. Ici on utilise tous les caractères de l'alphabet (minuscule et majuscule) plus les chiffres.
- head -c8 : permet d'ajuster la longueur du mot de passe. Ici il fera 8 caractères.
Si l'on souhaite avoir un retour chariot en fin de ligne, on pourra simplement utiliser echo :
echo `< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c8`
8 Commentaires pour "Générer des mots de passe aléatoires sous Linux"
Flux des commentaires de cet article Ajouter un commentaireUne petite erreur c'est glissée je pense. Ca ne serai pas plutôt :
cat /dev/urandom | tr -dc _A-Za-z0-9 | head -c8
echo `cat /dev/urandom | tr -dc _A-Za-z0-9 | head -c8`
On peu aussi utiliser _[:alnum:]
Et pourquoi ne pas utiliser pwgen ?
@layer973 : essaye la commande, tu verras qu'il n'y a pas besoin de cat.
@Anonymous : je ne connaissais pas pwgen. Ce programme semble également intéressant.
@layer973 : ne pas oublier le "<" en début de commande.
@pti-seb, Edouard
Mea culpa. Je n'avais en effet pas vu le < en début de ligne. Par contre je pense toujours qu'il n'y pas besoin des - entre a-Z A-Z et 0-9 sauf si on veut du caractère dans le mot de passe et auquel cas, pas besoin de le répéter (ou alors j'ai encore loupé un truc?).
@Anonyme : pwgen n'est pas installé par défaut chez moi. On pourrait considérer ça comme une dépendance. L'article si j'ai bien compris vise le fonctionnement "out of the box".
Ou alors la commande makepasswd qui fait la même chose ...
"makepasswd generates true random passwords by using the /dev/random feature of Linux, with the emphasis on security over pronounceability. It can also encrypt plaintext passwords given on the command line"
J'ai amélioré le script: http://pastebin.com/m2d87a781
case $# in
0)
echo "Combien de mots de passe souhaitez vous generer?"
read nbResultat
echo "Quelle taille auront ces mots de passe?"
read taille
for((i=0; i<${nbResultat}; i++));
do echo `< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${taille}`;
done
;;
1)
echo "Nombre de parametres insufisant"
echo -e "cmd 33[4mtaille du mdp33[0m 33[4mnombre de resultats33[0m"
;;
2)
#Teste si les paramètres sont positifs
if test "$1" -gt "0" && test "$2" -gt "0"
then
#Affiche un avertissement si la taille du mot de passe est trop grande, pour eviter d'avoir un script qui met 100 ans à s'executer.
if test "$1" -gt "100"
then
echo "Voulez vous vraiment afficher des mots de passe de $1 caracteres? o/n"
read reponse
if [ "$reponse" = "o" ]
then
if test "$2" -lt "100"
then
for((i=0; i<$2; i++));
do echo `< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c$1`;
done
else
echo "Voulez vous vraiment afficher $2 mots de passe differents? Ceci risque de prendre un moment o/n"
read reponse
if [ "$reponse" = "o" ]
then
for((i=0; i<$2; i++));
do echo `< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c$1`;
done
else
echo "Fin du script"
fi
fi
else
echo "Fin du script"
fi
else
if test "$2" -lt "100"
then
for((i=0; i<$2; i++));
do echo `< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c$1`;
done
else
echo "Voulez vous vraiment afficher $2 mots de passe differents? Ceci risque de prendre un moment o/n"
read reponse
if [ "$reponse" = "o" ]
then
for((i=0; i<$2; i++));
do echo `< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c$1`;
done
else
echo "Fin du script"
fi
fi
fi
else
echo "Les parametres doivent etre des entiers positifs"
fi
;;
*)
echo "Trop de paramètres."
;;
esac
Bonjour,
Très intéressant ce script.
J'ai voulu rajouter des caractères spéciaux.
J'ai d'abord tenté ça :
echo `< /dev/urandom tr -dc _A-Za-z0-9-\!\$\#\&@* | head -c12`
Ce qui place en général 1 caractère spécial, voir 0 et au maximum 3 et uniquement ceux contenus dans ma liste.
Par hasard, j'ai tenté cela :
echo `< /dev/urandom tr -dc \!$\#\&-A-Za-z | head -c12`
Et là, j'ai des ( des + des , etc...
Alors je ne comprends pas bien ma commande mais je suis satisfait de ce qu'elle produit en tout cas.