web-dev-qa-db-fra.com

Comment obtenir une chaîne aléatoire de 32 chiffres hexadécimaux via la ligne de commande?

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?

27
Ana

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 .

53
Renaud Pacalet

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.

15
user2350426

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
11
touzoku

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.

6
caveman