Voor MAC-adres met behulp van shell script

Op dit moment wordt de oplossing genoemd voor het krijgen van het MAC adres altijd gebruik maken van eth0.
Maar wat als in plaats van eth0 mijn interfaces beginnen met het eth1. Ook op OS X de interface namen zijn anders.

Ook de interface eth0, maar is ongebruikt. dus niet actief, het hoeft niet een IP-adres.

Dus is er een manier waarop ik kon het MAC-adres voor de eerste interface die Actief is.(dat wil zeggen het heeft een inet adres, en ik wil niet dat inet6).

Voor 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

OPMERKING : ik heb veranderd de waarden van de uitvoer.

Dus in dit geval wil ik het HWaddr voor eth1 en niet eth0.
Hoe vind ik het ? Ook het zou moeten werken op alle Linux smaken.

InformationsquelleAutor Pratham | 2014-05-23



11 Replies
  1. 10

    Zien dat de interface de naam en het MAC-adres zijn de eerste en laatste velden op een lijn geen witruimte tekens.

    Als één van de inspringende regels bevat inet addr: de nieuwste interface-naam en het MAC-adres moet worden afgedrukt.

    ifconfig -a |
    awk '/^[a-z]/{ iface=$1; mac=$NF; next }
        /inet addr:/{ print iface, mac }'

    Merk op dat meerdere interfaces kunnen voldoen aan uw criteria. Dan zal het script, het afdrukken van meerdere lijnen. (U kunt toevoegen ; exit net vóór de afsluitende accolade als je altijd alleen wilt afdrukken de eerste wedstrijd.)

    • Als uw doel is alleen voor Linux, zou het meer robuust te onderzoeken van de relevante /proc items direct; maar omdat je te vermelden OSX ook, ik neem aan dat die aanpak is uitgesloten.
    • net een lijn hoofd van -1 tot en met de eerste …
    • Toevoegen ; exit 0 na de print plaats.
  2. 56

    Kunt u het volgende doen

    ifconfig <Interface ex:eth0,eth1> | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'

    Ook kunt u voor MAC voor alle interface als volgt

    cat /sys/class/net/*/address

    Voor bepaalde interface als voor eth0

    cat /sys/class/net/eth0/address
  3. 35

    De beste Linux-specifieke oplossing is gebruik te maken van sysfs:

    $ IFACE=eth0
    $ read MAC </sys/class/net/$IFACE/address
    $ echo $IFACE $MAC
    eth0 00:ab:cd:12:34:56

    Deze methode is zeer schoon in vergelijking met de anderen en paait geen extra processen sinds read is een builtin commando voor POSIX-schalen, met inbegrip van niet-BASH shell. Echter, als u draagbaarheid van OS X, dan moet je gebruik maken van ifconfig en sed methoden, omdat OS X beschikt niet over een virtueel bestandssysteem-interface, zoals sysfs.

    • Dit zou het beste antwoord !
  4. 25
    $ ip route show default | awk '/default/{print $5}'

    terug: eth0 (mijn online interface)

    $ cat /sys/class/net/$(ip route show default | awk '/default/{print $5}')/address

    terug: eg:a8:6b:bd:55:05 (macaddress van de eth0, mijn online interface)

    Terminal afbeelding

    • Welkom op Stackoverflow. Please post meer informatie over uw antwoord. Wat het doet en waarom.
    • Beste antwoord in mijn mening. De anderen niet werkt al de tijd of afhankelijk zijn van een vaste interface naam.
    • Moeten worden geaccepteerd antwoord. IMHO wat het doet is heel eenvoudig, het hoeft geen uitleg. Dat zei deze oplossing is afhankelijk van ip route output formaat.
    • Denk ook dat dit moet de aanvaarde antwoord, misschien met wat edition of met behulp van ip-opdracht toevoegen
    • Eenvoudige + het werkt eigenlijk is het een hard-to-beat combo.
    • Bedankt voor het antwoord, dat was wat ik wilde; een manier om het MAC-adres in zonder te weten van de interface. +1

  5. 16

    Op een moderne GNU/Linux systeem kunt u zie het beschikbare netwerk interfaces een opsomming van de inhoud van /sys/class/net/, bijvoorbeeld:

    $ ls /sys/class/net/
    enp0s25  lo  virbr0  virbr0-nic  wlp2s0

    U kunt controleren of een interface is up bekeken operstate in het apparaat directory. Bijvoorbeeld, hier is hoe je kunt zien of enp0s25 is:

    $ cat /sys/class/net/enp0s25/operstate
    up

    Vervolgens kunt u voor de MAC adres van die interface met:

    $ cat /sys/class/net/enp0s25/address 
    ff:00:ff:e9:84:a5

    Bijvoorbeeld, hier is een eenvoudige bash-script dat wordt afgedrukt MAC-adressen voor actieve interfaces:

    #!/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

    En hier is de output van een systeem met een ethernet-en een wifi-interface:

    $ ./getmacifup.sh
    enp0s25
       ff:00:ff:e9:84:a5
    lo
    wlp2s0

    Voor details zie de Kernel documentatie


    Vergeet ook niet dat vanaf 2015 de meeste GNU/Linux distributies overgestapt naar systemd, en geen gebruik maken van ethX interface naamgeving eventuele meer – nu zij gebruik maken van een meer robuuste naamgeving is gebaseerd op de hardware topologie, zie:

  6. 3

    oh, als u wilt dat alleen de mac ether mac-adres, kunt u dat:

    ifconfig | grep "ether*" | tr -d ' ' | tr -d '\t' | cut -c 6-42

    (werken op macintosh)

    • ifconfig — je krijgt alle info
    • grep — houd de lijn met adres
    • tr — reinigen van alle
    • cut — verwijder de “ether” om alleen het adres
    • tr -d kunt verwijderen meerdere tekens in één keer. De regex ether* wedstrijden ethe gevolgd door nul of meer exemplaren van r; ik veronderstel dat je bedoelt eigenlijk grep 'ether' die overeenkomt met de letterlijke tekenreeks overal op de invoerregel. ifconfig | grep ether | tr -d ' \t' | cut -c 6-42
    • Dit werkt ook op macOS.
    • Net als het Awk in mijn antwoord, dat is vrij veel het zelfde ding in een enkel proces in plaats van een pijpleiding inroepen van meerdere processen.
  7. 2

    Eenvoudig:

    ifconfig | grep ether | cut -d " " -f10

    OF

    ip a | grep ether | cut -d " " -f6

    Deze twee voorbeeld-commando grep alle lijnen met de “ether” string en snijd het mac-adres (dat we nodig hebben) na het aantal ruimten (zoals opgegeven in de optie-f) van de opgezocht door deel.

    Getest op verschillende Linux-smaken

  8. 1

    Ik weet dat is een beetje gedateerd, maar met de basic-commando ‘ s, kunnen we het mac adres van een interface:

    ip link show eth0 | grep link/ether | awk '{print $2}'

    Een mooie dag!

  9. 1

    Geen van de bovenstaande heeft gewerkt voor mij, want mijn apparaten in een balance-rr bond. Het opvragen van beide zou zeggen hetzelfde MAC-adres met ip l l, ifconfig, of /sys/class/net/${device}/address, dus een van hen is juist, en de een is onbekend.

    Maar dit werkt als u nog niet hernoemd het apparaat (eventuele tips over wat ik heb gemist?):

    udevadm info -q all --path "/sys/class/net/${device}"

    En dit werkt zelfs als u de naam wijzigt (bv. ip l set name x0 dev p4p1):

    cat /proc/net/bonding/bond0

    of mijn lelijke script dat maakt het meer parsable (niet getest chauffeur/os/wat compatibiliteit):

    awk -F ': ' '
             $0 == "" && interface != "" {
                printf "%s %s %s\n", interface, mac, status;
                interface="";
                mac=""
             }; 
             $1 == "Slave Interface" {
                interface=$2
             }; 
             $1 == "Permanent HW addr" {
                mac=$2
             };
             $1 == "MII Status" {
                status=$2
             };
             END {
                printf "%s %s %s\n", interface, mac, status
             }' /proc/net/bonding/bond0
  10. 0

    Hier is een alternatief antwoord in het geval dat de hierboven genoemde, niet werken voor u. U kunt gebruik maken van de volgende oplossing(en), die werd gevonden hier:

    ip addr

    OF

    ip addr show

    OF

    ip link

    Alle drie deze zal uw MAC-adres(sen) naast link/ether. Ik struikelde op deze, want ik had er gewoon klaar voor een nieuwe installatie van Debian 9.5 vanaf een USB-stick zonder internet, dus ik kon slechts een zeer minimale installatie, en ontvangen

    -bash: ifconfig: command not found

    wanneer ik geprobeerd een aantal van de bovenstaande oplossingen. Ik dacht dat iemand anders kan komen over dit probleem. Hoop dat het helpt.

  11. -2

    Voor MAC adress voor eth0:

    $ cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep HWADDR | cut -c 9-25

    Voorbeeld:

    [[email protected] ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep HWADDR | cut -c 9-25
    55:b5:00:10:be:10
    • grep kunnen lezen van de input file gewoon goed. Vermijd de nutteloos gebruik van cat.
    • Beperkt tot Redhat derivaten.
    • dit kan mogelijk verkeerd zijn als gevolg ifcfg-eth0 is een configuratie bestand voor de specifieke interface/mac-adres, niet de eigenlijke interface/mac.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *