web-dev-qa-db-fra.com

Recherche de l'adresse MAC d'origine à partir du matériel lui-même

OS: REDHAT LINUX Linux gérer: 2.6.18.8-1 #

Est-il possible de lire le formulaire d'adresse MAC NIC directement? J'ai le code ci-dessous mais il suffit de lire à partir de la couche ci-dessus mais pas la carte elle-même !!!

J'essaie de trouver comment trouver l'adresse MAC d'origine d'un Ethernet NIC sur ma boîte Linux. Je comprends comment trouver l'adresse MAC actuelle en utilisant ifconfig, mais si l'adresse a été changé, par exemple en utilisant 'ifconfig eth0 hw ether uu:vv:ww:yy:xx:zz', ou je l'ai défini comme "permanent" en utilisant vi /etc/sysconfig/network-scripts/ifcfg-eth0. ce fichier ... Je peux avec succès UP le faire dans REBOOT aussi. comment trouver l'original? Il doit y avoir un moyen de le trouver, car il est toujours gravé en permanence dans la carte, mais je ne trouve pas d'outil pour lire l'adresse gravée. existe-t-il un utilitaire ou une commande pour cela? Je suppose que pour écrire du code C pour cela. mais je ne sais pas comment faire cela dans le cas ci-dessus.

** le code ci-dessous donne mon MAC actuel mais pas le MAC d'origine

#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

Certes, dans ethtool 3.1, vous pouvez simplement imprimer l'adresse: ethtool -P | --show-permaddr DEVNAME Afficher l'adresse matérielle permanente

par exemple.

ethtool -P eth0

Adresse permanente: 94: de: 80: 6a: 21: 25

51
Jason Morgan

Essayez cat /sys/class/net/eth0/address ou cat /sys/class/net/em1/address si vous utilisez Fedora. Ça devrait marcher.

La réponse originale est ici: Notes d'un administrateur système

16
tver3305

La seule façon de trouver l'adresse MAC d'origine est d'utiliser la même méthode que le pilote de la carte réseau - malheureusement, je ne crois pas qu'il existe un moyen générique de dire au pilote de fournir son adresse MAC "telle que fournie par le matériel". Bien sûr, il y a des cas où il n'y a pas de carte réseau matérielle pour cette interface particulière - des pilotes de réseau virtuel pour la virtualisation et lors de l'utilisation de ponts et de commutateurs logiciels par exemple.

Et bien sûr, le matériel peut être tel que vous ne pouvez pas réellement lire l'adresse MAC "d'origine" lorsqu'elle a été écrasée par le logiciel, car il n'y a qu'un seul ensemble de registres pour l'adresse MAC elle-même.

J'ai jeté un coup d'œil aux pilotes pcnet32.c (parce que c'est l'un des modèles de carte réseau que j'ai une idée approximative de son fonctionnement et de l'emplacement des différents registres, etc., afin que je puisse voir ce qu'il fait). Pour autant que je puisse voir, il ne prend en charge aucune méthode pour demander réellement "quelle est votre PROM adresse Ethernet" - l'adresse MAC est lue pendant la section "probe1" de l'initialisation du module, et Aucun autre accès à ces registres matériels n’est effectué.

8
Mats Petersson

Eh bien, l'ancienne adresse Ethernet reste dans les premiers octets de la carte eeprom (au moins pour certains types de cartes), il est donc possible de l'extraire en utilisant ethtool

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

où tt: uu: ww: xx: yy: zz est l'ancienne adresse mac

7
begemotv2718

Ce n'est peut-être pas la méthode programmatique, mais pourquoi ne pas rechercher dmesg. Tous les NIC de mes machines crachent l'adresse MAC au moment de la détection.

Essayez quelque chose comme ceci:

dmesg|grep eth0

Différentes cartes réseau affichent différemment l'adresse MAC, mais le journal contiendra toujours le nom donné au noyau de l'adaptateur (dans la plupart des cas, eth0 ou wlan0).

6
user3462738