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;
}
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
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
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é.
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
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
).