Je voudrais mettre sur pied une commande qui imprimera une chaîne de 32 chiffres hexadécimaux. J'ai un script Python qui fonctionne:
python -c 'import random ; print "".join(map(lambda t: format(t, "02X"), [random.randrange(256) for x in range(16)]))'
Cela génère une sortie comme:
6EF6B30F9E557F948C402C89002C7C8A
C'est ce dont j'ai besoin.
Sur un Mac, je peux même faire ceci:
uuidgen | tr -d '-'
Cependant, je n'ai pas accès aux langages de script plus sophistiqués Ruby et python, et je ne serai pas sur un Mac (donc pas d'uuidgen). J'ai besoin de m'en tenir à plus de bash ' des outils tels que sed, awk,/dev/random car je suis sur une plate-forme limitée. Existe-t-il un moyen de le faire?
Si vous avez hexdump
alors:
hexdump -n 16 -e '4/4 "%08X" 1 "\n"' /dev/random
devrait faire le travail.
Explication:
-n 16
pour consommer 16 octets d'entrée (32 chiffres hexadécimaux = 16 octets).4/4 "%08X"
pour itérer quatre fois, consommer 4 octets par itération et imprimer la valeur 32 bits correspondante sous la forme de 8 chiffres hexadécimaux, avec des zéros en tête, si nécessaire.1 "\n"
pour terminer avec une seule nouvelle ligne.Remarque: cette solution utilise /dev/random
mais il pourrait tout aussi bien utiliser /dev/urandom
. Le choix entre les deux est une question complexe et hors du champ de cette réponse. Si vous n'êtes pas sûr, jetez un œil à cette autre question .
Il y a trois façons que je connais:
#!/bin/bash
n=16
# Read n bytes from urandom (in hex):
xxd -l "$n" -p /dev/urandom | tr -d " \n" ; echo
od -vN "$n" -An -tx1 /dev/urandom | tr -d " \n" ; echo
hexdump -vn "$n" -e ' /1 "%02x"' /dev/urandom ; echo
Utilisez-en un, commentez les deux autres.
Si vous recherchez une seule commande et que openssl est installé, voir ci-dessous. Générez au hasard 16 octets (32 symboles hexadécimaux) et encodez en hexadécimal (également -base64 est pris en charge).
openssl Rand -hex 16
Voici quelques options supplémentaires, qui ont toutes la propriété Nice de fournir un moyen évident et facile de sélectionner directement la longueur de la chaîne de sortie. Dans tous les cas ci-dessous, il suffit de changer le "32" à la longueur de chaîne souhaitée.
#works in bash and busybox, but not in ksh
tr -dc 'A-F0-9' < /dev/urandom | head -c32
#works in bash and ksh, but not in busybox
tr -dc 'A-F0-9' < /dev/urandom | dd status=none bs=1 count=32
#works in bash, ksh, AND busybox! w00t!
tr -dc 'A-F0-9' < /dev/urandom | dd bs=1 count=32 2>/dev/null
EDIT: Testé dans différents coques.