web-dev-qa-db-fra.com

Obtenir une adresse MAC à l'aide d'un script Shell

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.

18
Pratham

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

9
tripleee

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
46
Jayesh Bhoi

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.

25
Dave
$ 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)

Image du terminal

22
Elismar Luz

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.

12
gerlos

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 informations
  • grep - conserve la ligne avec l'adresse
  • tr - tout nettoyer
  • cut - enlève "l'éther" pour n'avoir que l'adresse
2
MajorTom

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

0
sk8forether

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

0
Ibrahim AlMahfooz