Comment générer une adresse MAC aléatoire à partir de la ligne de commande Linux?
Je recherche une solution qui ne nécessite que des outils standard couramment trouvés sur la ligne de commande Linux.
L'adresse MAC sera utilisée pour un KVM invité.
J'utilise
macaddr=$(echo $FQDN|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
L'avantage de cette méthode, par rapport à un nombre complètement aléatoire, est qu'il est possible de reproduire de manière fiable l'adresse MAC en fonction du FQDN de la machine, ce que je trouve parfois utile. Le 02
pour le premier octet définit simplement le bit "assigné localement", ce qui rend évident qu'il ne s'agit pas d'une adresse MAC fournie par le fournisseur, et garantit que vous n'entrerez pas en collision avec une véritable adresse MAC de carte réseau.
Si vous devez générer plusieurs adresses MAC par hôte, j'ai utilisé pour concaténer le FQDN avec le nom du pont auquel connecter l'interface; cela a bien réussi à répartir les choses entre les différentes cartes réseau.
Les scripts postés sont bons, mais je veux ajouter un avertissement: Mind the Birthday (paradoxon)!
Cela vient du fait que même si vous n'avez que 23 personnes, il y a déjà 50% de chances que 2 d'entre elles fêtent leur anniversaire le même jour.
Cela dépend de votre scénario, de la façon dont vous l'utilisez, mais si vous générez le MACS au hasard, à environ 1 million, votre chance pour un conflit de numéros mac est de 40% à 2 millions, c'est déjà 87%!
Si vous n'avez besoin que de quelques, c'est correct, mais lorsque vous gérez une batterie de serveurs avec des centaines de serveurs, chacun d'entre eux hébergeant des dizaines de machines virtuelles, ou si vous utilisez les macs comme index dans une base de données pour la comptabilité et que vous avez besoin d'uniques, soyez prudent !
myserver% Perl -e 'for ($i=0;$i<6;$i++){@m[$i]=int(Rand(256));} printf "%X:%X:%X:%X:%X:%X\n",@m;'
55:C2:A5:FA:17:74
Ah, l'ol ' Swiss Army Chainsaw chevauche à nouveau. Et par le biais de la version 0.2, je vole sans vergogne l'excellent point de womble sur le premier octet étant 02:
myserver% Perl -e 'for ($i=0;$i<5;$i++){@m[$i]=int(Rand(256));} printf "02:%X:%X:%X:%X:%X\n",@m;'
02:8E:94:A3:47:26
Ces variantes fonctionnent également.
plus long:
openssl Rand -hex 6 | sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1:\2:\3:\4:\5:\6/'
ou plus court:
openssl Rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'
La consommation de charge des deux variantes est très similaire selon une mesure rapide avec le temps.
Je sais que ce message est ancien, mais pour les futurs visiteurs, si vous voulez une adresse MAC pseudo-aléatoire sécurisée cryptographiquement, sans être limitée à 0x02 en tant qu'OUI, voici un générateur agnostique rapide pour la plupart des plateformes:
$ printf '%02x' $((0x$(od /dev/urandom -N1 -t x1 -An | cut -c 2-) & 0xFE | 0x02)); od /dev/urandom -N5 -t x1 -An | sed 's/ /:/g'
Voici cinq autres options, qui utilisent toutes des bits aléatoires pour le bit le moins significatif de l'octet le plus significatif qui indique si l'adresse est unicast ou multicast et pour le deuxième bit le moins significatif de l'octet le plus significatif qui indique si l'adresse est universellement ou localement administré.
jot -w%02X -s: -r 6 1 256
openssl Rand -hex 6|fold -w2|paste -sd: -
od -N6 -tx1 -An /dev/random|awk '$1=$1'|tr \ :
god -N6 -tx1 -An /dev/random|cut -c2-|tr \ :
hexdump -n6 -e'/1 ":%02X"' /dev/random|cut -c2-
jot
est fourni avec OS X et BSD mais pas avec la plupart des distributions Linux. Dans jot
-w
Change le format, -s
Change le séparateur et -r
Génère des nombres aléatoires.
od
est dans POSIX mais hexdump
ne l'est pas.
od
d'OS X (/usr/bin/od
Ci-dessous) utilise un format de sortie différent de GNU od
:
$ /usr/bin/od -N6 -tx1 -An /dev/random|tr ' ' :
:::::::::::d9::b9::d7::da::5f::96::::::::::::::::::::::::::::::::::::::::
$ god -N6 -tx1 -An /dev/random|tr ' ' :
:f5:6d:0a:3b:39:f9
Dans les options od
d'OS X placées après un argument pour un fichier d'entrée sont traitées comme les noms des fichiers d'entrée, donc la commande dans la réponse d'Aaron Toponce lit indéfiniment de /dev/urandom
Avec od
.
En voici un autre, basé sur la réponse de wombie:
macaddr=$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/')
echo $macaddr
Vous pouvez simplement ajouter un $ RANDOM après $ FQDN et cela vous donnera des adresses mac aléatoires à chaque fois que vous l'exécuterez. Ceci est particulièrement utile pour les personnes qui souhaitent créer des vms de sauvegarde en utilisant des instantanés ou des clones de vms.
macaddr=$(echo $FQDN$RANDOM|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
J'utilise:
echo -n 02; od -t x1 -An -N 5 /dev/urandom | tr ' ' ':'
Python one-liner:
python3 -c 'import os; print(":".join(["{:02x}".format(x) for x in b"\02x" + os.urandom(5)]))'
Juste pour le plaisir, voici une version pure bash, testée contre la version Bash 4.4.12 (1):
read -N6 b </dev/urandom
LC_ALL=C printf "%02x:%02x:%02x:%02x:%02x:%02x\n" "'${b:0:1}" "'${b:1:1}" "'${b:2:1}" "'${b:3:1}" "'${b:4:1}" "'${b:5:1}"
La première ligne lit 6 caractères de /dev/urandom
; puis en utilisant le jeu de caractères C, imprimez la valeur hexadécimale remplie de 0 de chaque caractère séparé par deux points (la nouvelle ligne est facultative mais utile pour imprimer la valeur).
L'extraction de la valeur d'un caractère à l'aide de printf est définie dans la documentation POSIX printf :
Si le premier caractère est un guillemet simple ou un guillemet double, la valeur doit être la valeur numérique dans le jeu de codes sous-jacent du caractère suivant le guillemet simple ou le guillemet double.