Actuellement, toutes les solutions mentionnées pour obtenir l'adresse MAC utilisent toujours eth0 . Mais si, au lieu de eth0, mes interfaces commencent par eth1. Sur OS X également, les noms d'interface sont différents.
De plus, l'interface eth0 peut être présente mais n'est pas utilisée. c'est-à-dire pas actif, il n'a pas d'adresse IP.
Donc, y a-t-il un moyen d'obtenir l'adresse MAC de la première interface disponible qui soit active (c'est-à-dire qu'elle a une adresse inet, je ne veux même pas en avoir une avec inet6).
Pour E.g
eth0 Link encap:Ethernet HWaddr <some addr>
inet6 addr: <some addr> Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:123
RX packets:123 errors:123 dropped:123 overruns:123 frame:123
TX packets:123 errors:123 dropped:123 overruns:123 carrier:123
collisions:123 txqueuelen:123
RX bytes:123 (123 MB) TX bytes:123 (123 KB)
Interrupt:123 Memory:00000000-00000000
eth1 Link encap:Ethernet HWaddr <some addr>
inet addr:<some addr> Bcast:<some addr> Mask:<some addr>
inet6 addr: <some addr> Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:123 Metric:123
RX packets:123 errors:123 dropped:123 overruns:123 frame:123
TX packets:123 errors:123 dropped:123 overruns:123 carrier:123
collisions:123 txqueuelen:123
RX bytes:123 (123 MB) TX bytes:123 (123 KB)
Interrupt:123 Memory:00000000-00000000
REMARQUE: j'ai changé les valeurs de la sortie.
Donc, dans ce cas, je veux le HWaddr pour eth1 et pas eth0 . Comment le trouver? En outre, cela devrait fonctionner sur toutes les versions de Linux.
Observez que le nom de l'interface et l'adresse MAC sont les premier et dernier champs d'une ligne sans espace blanc.
Si l'une des lignes en retrait contient inet addr:
, le dernier nom d'interface et l'adresse MAC doivent être imprimés.
ifconfig -a |
awk '/^[a-z]/ { iface=$1; mac=$NF; next }
/inet addr:/ { print iface, mac }'
Notez que plusieurs interfaces pourraient répondre à vos critères. Ensuite, le script imprimera plusieurs lignes. (Vous pouvez ajouter ; exit
juste avant la dernière accolade de clôture si vous souhaitez toujours uniquement imprimer la première correspondance.)
Vous pouvez faire comme suit
ifconfig <Interface ex:eth0,eth1> | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'
Aussi, vous pouvez obtenir MAC pour toutes les interfaces comme suit
cat /sys/class/net/*/address
Pour une interface particulière comme pour eth0
cat /sys/class/net/eth0/address
La meilleure solution spécifique à Linux consiste à utiliser sysfs:
$ IFACE=eth0
$ read MAC </sys/class/net/$IFACE/address
$ echo $IFACE $MAC
eth0 00:ab:cd:12:34:56
Cette méthode est extrêmement propre comparée aux autres et ne génère aucun processus supplémentaire puisque read
est une commande intégrée destinée aux shells POSIX, y compris les shells non BASH. Cependant, si vous avez besoin de la portabilité vers OS X, vous devrez alors utiliser les méthodes ifconfig
et sed
, car OS X ne dispose pas d'une interface de système de fichiers virtuelle semblable à sysfs.
$ ip route show default | awk '/default/ {print $5}'
return: eth0 (mon interface en ligne)
$ cat /sys/class/net/$(ip route show default | awk '/default/ {print $5}')/address
return: ec: a8: 6b: bd: 55: 05 (adresse MAC de l'eth0, mon interface en ligne)
Sur un système GNU/Linux moderne, vous pouvez voir les interfaces réseau disponibles répertoriant le contenu de /sys/class/net/
, par exemple:
$ ls /sys/class/net/
enp0s25 lo virbr0 virbr0-nic wlp2s0
Vous pouvez vérifier si une interface est up
en regardant operstate
dans le répertoire du périphérique. Par exemple, voici comment vous pouvez voir si enp0s25
est en place:
$ cat /sys/class/net/enp0s25/operstate
up
Vous pouvez alors obtenir l'adresse MAC de cette interface avec:
$ cat /sys/class/net/enp0s25/address
ff:00:ff:e9:84:a5
Par exemple, voici un script bash simple qui affiche les adresses MAC des interfaces actives:
#!/bin/bash
# getmacifup.sh: Print active NICs MAC addresses
D='/sys/class/net'
for nic in $( ls $D )
do
echo $nic
if grep -q up $D/$nic/operstate
then
echo -n ' '
cat $D/$nic/address
fi
done
Et voici sa sortie sur un système avec un ethernet et une interface wifi:
$ ./getmacifup.sh
enp0s25
ff:00:ff:e9:84:a5
lo
wlp2s0
Pour plus de détails, voir Documentation du noyau
N'oubliez pas également qu'à partir de 2015, la plupart des distributions GNU/Linux sont passées à systemd
et n'utilisent plus le schéma de nommage d'interface ethX
; elles utilisent désormais une convention de nommage plus robuste basée sur la topologie matérielle.
oh, si vous voulez seulement l'adresse mac ether mac, vous pouvez l'utiliser:
ifconfig | grep "ether*" | tr -d ' ' | tr -d '\t' | cut -c 6-42
(travail sur Macintosh)
ifconfig
- obtenir toutes les informationsgrep
- conserve la ligne avec l'adressetr
- tout nettoyercut
- enlève "l'éther" pour n'avoir que l'adresseVoici une réponse alternative au cas où celles énumérées ci-dessus ne fonctionneraient pas pour vous. Vous pouvez également utiliser la ou les solutions suivantes, qui ont été trouvées ici :
ip addr
OR
ip addr show
OR
ip link
Les trois afficheront votre ou vos adresses MAC à côté de link/ether
. Je suis tombé sur cela parce que je venais de faire une nouvelle installation de Debian 9.5 à partir d’une clé USB sans accès Internet.
-bash: ifconfig: command not found
quand j'ai essayé certaines des solutions ci-dessus. J'ai pensé que quelqu'un d'autre pourrait également rencontrer ce problème. J'espère que ça aide.
Exécutez simplement:
ifconfig | grep ether | cut -d " " -f10
OR
ip a | grep ether | cut -d " " -f6
Ces deux exemples de commandes vont grep toutes les lignes avec la chaîne "ether" et couper l'adresse MAC (nécessaire) suivant les espaces numériques (spécifiés dans l'option -f) de la partie grepped.
Testé sur différentes variétés de Linux