it-swarm.com.de

Ermitteln der ursprünglichen MAC-Adresse von der Hardware selbst

Betriebssysteme: REDHAT LINUX Linux verwalten: 2.6.18.8-1 #

Kann man die MAC-Adresse von NIC direkt lesen? Ich habe den folgenden Code, aber er liest nur von der oberen Ebene, aber nicht von der Karte selbst !!!

Ich versuche herauszufinden, wie ich die ursprüngliche MAC-Adresse eines Ethernets NIC auf meiner Linux-Box finde. Ich verstehe, wie man die aktuelle MAC-Adresse mit ifconfig findet, aber wenn die Adresse geändert wurde, sagen wir mit 'ifconfig eth0 hw ether uu:vv:ww:yy:xx:zz', Oder ich setze sie mit vi /etc/sysconfig/network-scripts/ifcfg-eth0 Auf "permanent". Diese Datei ... Ich kann es auch in UP erfolgreich REBOOT. wie finde ich das original Es muss einen Weg geben, es zu finden, da es immer noch permanent in die Karte eingebrannt ist, aber ich kann kein Werkzeug finden, um die eingebrannte Adresse zu lesen. Gibt es ein Dienstprogramm dafür oder einen Befehl dafür? Ich nehme an, C-Code dafür zu schreiben. Aber ich weiß nicht, wie ich das im obigen Fall machen soll.

** Der folgende Code gibt meinen aktuellen MAC an, aber nicht den ursprünglichen MAC

#include <stdio.h>              /* Standard I/O */
#include <stdlib.h>             /* Standard Library */
#include <errno.h>              /* Error number and related */


#define ENUMS
#include <sys/socket.h>
#include <net/route.h>
#include <net/if.h>
#include <features.h>           /* for the glibc version number */
#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
#include <netpacket/packet.h>
#include <net/ethernet.h>       /* the L2 protocols */
#else
#include <asm/types.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>     /* The L2 protocols */
#endif
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <sys/ioctl.h>
#include <netdb.h>


int main( int argc, char * argv[] ){

unsigned char  mac[IFHWADDRLEN];
int i;
    get_local_hwaddr( argv[1], mac );
    for( i = 0; i < IFHWADDRLEN; i++ ){
        printf( "%02X:", (unsigned int)(mac[i]) );
    }

}


int get_local_hwaddr(const char *ifname, unsigned char *mac)
{
    struct ifreq ifr;
    int fd;
    int rv;                     // return value - error value from df or ioctl call

    /* determine the local MAC address */
    strcpy(ifr.ifr_name, ifname);
    fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
    if (fd < 0)
        rv = fd;
    else {
        rv = ioctl(fd, SIOCGIFHWADDR, &ifr);
        if (rv >= 0)            /* worked okay */
            memcpy(mac, ifr.ifr_hwaddr.sa_data, IFHWADDRLEN);
    }

    return rv;
}
30
Jatin Bodarya

Natürlich können Sie in ethtool 3.1 nur die Adresse ausgeben: ethtool -P | --show-permaddr DEVNAME Permanente Hardwareadresse anzeigen

z.B.

ethtool -P eth0

Ständige Anschrift: 94: de: 80: 6a: 21: 25

51
Jason Morgan

Versuchen cat /sys/class/net/eth0/address oder cat /sys/class/net/em1/address bei Verwendung von Fedora. Es sollte funktionieren.

Die ursprüngliche Antwort ist hier: Anmerkungen eines Systemadministrators

16
tver3305

Der einzige Weg, die ursprüngliche MAC-Adresse zu finden, ist die gleiche Methode wie der Netzwerkkartentreiber. Leider glaube ich nicht, dass es eine generische Methode gibt, den Treiber anzuweisen, seine MAC-Adresse "wie von der Hardware bereitgestellt" anzugeben. Natürlich gibt es Fälle, in denen es für diese bestimmte Schnittstelle keine Hardware-Netzwerkkarte gibt - virtuelle Netzwerktreiber für die Virtualisierung und zum Beispiel bei Verwendung von Bridges und Software-Switches.

Und natürlich kann die Hardware so beschaffen sein, dass Sie die "ursprüngliche" MAC-Adresse nicht lesen können, wenn sie von der Software überschrieben wurde, da es nur einen Registersatz für die MAC-Adresse selbst gibt.

Ich habe einen kurzen Blick auf die pcnet32.c-Treiber geworfen (da es sich um eines der Modelle von Netzwerkkarten handelt, bei denen ich eine ungefähre Vorstellung davon habe, wie es funktioniert und wo sich die verschiedenen Register usw. befinden, damit ich sehen kann, was es tut). Soweit ich sehen kann, unterstützt es keine Methode, um tatsächlich zu fragen, "was ist Ihre PROM Ethernet-Adresse" - die MAC-Adresse wird während des Abschnitts "Probe1" der Modulinitialisierung ausgelesen, und Es wird kein weiterer Zugriff auf diese Hardwareregister vorgenommen.

8
Mats Petersson

Nun, die alte Ethernet-Adresse verbleibt in den ersten Bytes des Karten-EEPROM (zumindest für einige Kartentypen), sodass es möglich ist, sie mit ethtool zu extrahieren.

bash$ Sudo ethtool -e eth1
Offset      Values
------      ------
0x0000      tt uu ww xx yy zz 79 03 
0x....

dabei ist tt: uu: ww: xx: yy: zz die alte Mac-Adresse

7
begemotv2718

Dies ist möglicherweise nicht der programmatische Weg, aber warum nicht dmesg suchen. Alle NICs meiner Computer geben die MAC-Adresse zum Zeitpunkt der Erkennung aus.

Versuchen Sie so etwas:

dmesg|grep eth0

Verschiedene Netzwerkkarten zeigen die MAC-Adresse unterschiedlich an, aber das Protokoll enthält immer den angegebenen Kernelnamen des Adapters (in den meisten Fällen eth0 oder wlan0).

6
user3462738