Rechercher : dans
Par :

[Shell] - Générer une chaine aléatoire

Dernière réponse le 12 mar 2008 à 07:10:07 Phiphi57, le 11 aoû 2006 à 22:08:15 
 Signaler ce message aux modérateurs

Bonjour a tous,

voila, je souhaite créer des mots de passe pour utilisateurs via md5, et j'aimerai utiliser un "salt" aléatoire.
Pour le moment, j'ai un truc bidouillé du style :

mkpasswd --hash=md5 Mot2PasS `uuidgen | awk 'BEGIN{FS="-"} {print $1}'`  


par contre, uuidgen ne génère pas de majuscule apparemment.
est ce qu'il existe une commande sur une ligne permettant de générer une chaine aléatoire de 8 caractères comprenant a..z,A..Z,0..9 ??
(pour info, uuidgen ne semble utiliser que les chiffres et les minuscules)

Merci d'avance!

Phiphi

Meilleures réponses pour « [Shell] Générer une chaine aléatoire » dans :
Générer des nombres aléatoires efficacement avec rand() Voir Générer des nombres aléatoires efficacement avec rand() Vous avez peut-être remarqué qu'en C, en utilisant la fonction rand() de la bibliothèque standard, vous obtenez des résultats décevants, trop souvent les mêmes. Prenons un exemple, vous...
[Shell] Tester une variable numérique VoirTester une variable numérique    Préambule Dans un environnement "shell", les variables sont, par défaut, de type "chaîne de caractères". De ce fait il n'est pas possible de déclarer une variable de type "entier" (enfin, ceci n'est pas tout à...
Connecter le PC à la chaîne hifi sans fil VoirVotre PC est dans le bureau et votre chaîne hifi dans le salon et vous souhaiteriez profiter du son de votre installation hifi pour écouter vos MP3 stockés sur l'ordinateur ? Cette fiche a pour objectif de recenser les différentes possibilités de...
Télécharger WIFI Key Generator VoirLes connexions Wifi sont certes très pratiques, mais étant donné qu'ils ne nécessitent aucun câblage, tout le monde peut s'y connecter si son ordinateur est compatible avec le Wifi. WIFI Key Generator est une petite application destinée à générer des...
Linux - Le shell VoirIntroduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire le système...
Connecter l'ordinateur à une chaîne HIFI VoirPourquoi brancher son PC sur une chaîne? Les ordinateurs fournissent désormais un son aussi bon que des chaînes hifi. Il est possible de s'en servir pour écouter de la musique notamment grâce aux fichiers mp3 qui restituent un son quasimment...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...

1

lami20j, le 11 aoû 2006 à 22:20:54

Salut,

perl -e '@c=("A".."Z","a".."z",0..9);print join("",@c[map{rand @c}(1..8)]),"\n"'
Le caractère \n est seulement pour affichage.

Exemples
$ 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

Répondre à lami20j

2

lami20j, le 11 aoû 2006 à 22:40:44

Re,

et avec mkpasswd

mkpasswd --hash=md5 `perl -e '@c=("A".."Z","a".."z",0..9);print join("",@c[map{rand @c}(1..8)])'`
lami20j

Répondre à lami20j

3

Phiphi57, le 11 aoû 2006 à 22:52:29

Salut!

Merci pour cette réponse rapide!!!
il me semblait effectivement avoir vu trainer ce truc avec perl (qui est un langage que je ne connaissais pas du tout...)

deux petites questions subsdidiaires tant que j'y suis :
1-/ y a t il un équivalent purement "bash"?
2-/ Question sous-jacente : perl est il installé par défaut sur tout os GNU/Linux? (l'idée étant d'avoir une méthode basique qui fonctionne a coup sûr chez n'importe qui, pour la mettre éventuellement dans un tuto...)

Sinon, pour mes propres besoins, RAS, ta solution est parfaite!
Merci encore!

Phiphi

Répondre à Phiphi57

4

lami20j, le 11 aoû 2006 à 22:55:45

Re,

y a t il un équivalent purement "bash"?

Je pense que oui. Mais il faut reveiller les maîtres jipicy, asevere, jisisv, ... ;)


perl est il installé par défaut sur tout os GNU/Linux?

Oui. Perl est integré dans tout système GNU/Linux.

lami20j

Répondre à lami20j

5

lami20j, le 12 aoû 2006 à 04:22:04

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

Répondre à lami20j

7

jipicy, le 12 aoû 2006 à 11:40:53

Salut,

Ben te voilà "guru" maintenant ;-))

Sinon, sous Mndriva le "mkpasswd" installé n'est pas du tout le même que sous Debian, la preuve :

[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]$
Il date de 1994 :
AUTHOR
       Don Libes, National Institute of Standards and Technology

       mkpasswd is in the public domain.  NIST and I would  appreciate  credit
       if this program or parts of it are used.

                                22 August 1994                     MKPASSWD(1)
et ne gère pas le "--hash=" ni le "salt"...

;-\

Sinon j'ai trouvé ça sur le Net (en Perl) : http://www.ajs.com/~ajs/mkpasswd.html

:-)) Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

8

lami20j, le 12 aoû 2006 à 11:45:46

Salut,

donc j'avais raison de demander reveiller les Maîtres

lami20j

Répondre à lami20j

6

Phiphi57, le 12 aoû 2006 à 09:41:31

Merci pour tout, c'est nickel!

Phiphi

Répondre à Phiphi57

9

santiago69, le 11 mar 2008 à 22:40:16

J'essaye de faire un scripts base sur celui ci.
L'idee est de permettre la commande suivantes :

pwgen [length] [-aA0]
  length    la longueur du mot de passe
  -a        utiliser des minuscules
  -A        utiliser des majuscules
  -0        utiliser des chiffres

Mon code est le suivant :
#!/bin/bash
# http://www.commentcamarche.net/forum/affich 2335882 shell generer une chaine aleatoire

syntax="`basename $0` [length] [-aA0]\n  length    password length"

# Read parameters
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

# Set default
[ $l ] || l=8
[ $M ] || M="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"


while [ "${n:=1}" -le "$l" ]
do  pass="$pass${M:$(($RANDOM%${#M})):1}"
  let n+=1
done
echo "$pass"

Les problemes sont les suivants :
1) Pourquoi mes doubles espaces sont supprimes dans la variable syntax
2) *[0-9] reconnait les nombres mais aussi 3r5
Quelle syntaxe utiliser pour capter uniquement les combinaisons de chiffres
3) [aA0] reconnait a, A et 0 mais pas aA, A0, etc...
Quelle syntaxe utiliser pour capter toutes les combinaisons possibles de a, A et 0

Merci d'avoir presente ce bout de code qui me pernet d'en decouvrir toujours plus sur les scripts
Santiago

Il y a 10 types de personnes dans le monde
Ceux qui comprennent le binaire et les autres.

Répondre à santiago69

10

santiago69, le 11 mar 2008 à 23:01:01

Encore un autre probleme.
Ligne 10

    [ $l ] && (echo -e $syntax; exit 1)

En cas d'erreur, la syntaxe est bien affichee mais exit 1 n'est pas respecte. Le programme continue.
J'ai remplace par
    [ $l ] && echo -e $syntax && exit 1

Ca marche mais c'est completement par hasard apres moultes tentatives.
Est ce que quelqu'un connait la syntaxe correcte d'un if then sur une seule ligne ?


Il y a 10 types de personnes dans le monde
Ceux qui comprennent le binaire et les autres.

Répondre à santiago69

11

lami20j, le 12 mar 2008 à 06:40:49

Salut,

1. il faut utliser "$syntax"

2. *[0-9] veut dire n'importe quel caractère n'importe combien des fois suit d'un chiffire
si tu écrit r5 ça ne marche pas en revanche si tu écrit 3r5 le 1er caractère c'est un chiffre (mais attention pas un entier) donc 3r5 sera afficher

regarde ici
http://www.commentcamarche.net/faq/sujet 4605 shell tester une variable numerique#expr

3. mieux vaux utliser getopts

voici un test

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

Répondre à lami20j

12

jipicy, le 12 mar 2008 à 07:00:04

Salut,

3. mieux vaux utliser getopts
Voir : http://www.commentcamarche.net/forum/affich 2520040 parametres commencant par un tiret#2

Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

13

 jisisv, le 12 mar 2008 à 07:10:07

Voir également pwgen (disponible évidemment sous debian)
http://sourceforge.net/projects/pwgen/

Johan
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)

Répondre à jisisv