web-dev-qa-db-fra.com

comment générer une adresse MAC aléatoire à partir de la ligne de commande Linux

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é.

27
Erik Sjölund

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.

47
womble

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 !

8
flolo
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
5
MadHatter

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.

5
Jaroslav Kucera

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'
4
Aaron Toponce

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.

2
nisetama

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
2
gucki

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/')
1
Quicksilver

J'utilise:

echo -n 02; od -t x1 -An -N 5 /dev/urandom | tr ' ' ':'
0
Jérôme Pouiller

Python one-liner:

python3 -c 'import os; print(":".join(["{:02x}".format(x) for x in b"\02x" + os.urandom(5)]))'
0
presto8

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.

0