Trouver adresse MAC d'origine du Matériel lui-même
Os:REDHAT LINUX, Linux gérer: 2.6.18.8-1 #
Est-ce possible de lire l'adresse MAC de forme NIC directement ? J'ai ci-dessous de code, mais il vient de lire à partir de ci-dessus de la couche, mais pas la carte elle-même !!!
J'essaie de comprendre comment trouver l'adresse MAC d'origine d'un ethernet NIC sur mon linux. Je comprends comment trouver l'adresse MAC actuelle à l'aide de la commande ifconfig, mais si l'adresse a été modifiée, par exemple à l'aide de
'ifconfig eth0 hw ether uu:vv:ww:yy:xx:zz'
,ou j'ai mis "permanent" à l'aide de vi /etc/sysconfig/network-scripts/ifcfg-eth0
.ce fichier...je peux réussir à UP
dans REBOOT
aussi. comment puis-je trouver l'original? Il doit y avoir moyen de le trouver, parce qu'il est encore gravé de façon permanente dans la carte, mais je ne peux pas trouver un outil pour lire le brûlé dans l'adresse.
est-il un utilitaire ou de commande pour elle?
Je suppose que d'écrire du code C pour elle. mais vous ne savez pas comment faire dans le cas ci-dessus.
** code ci-dessous donne mon actuel MAC mais pas d'origine 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;
}
- Juste parce qu'il est brûlé, ne signifie pas qu'il doit être disponible. Je ne sais pas comment linux et les cartes de travail, mais il serait tout à fait plausible si le MAC a été restaurée sur un cycle d'alimentation lorsque les cartes du firmware ne l'initialisation.
- Je veux juste ma machine avec l'USURPATION de MAC et je peux le faire avec succès . mais lors que je veux que mon MAC d'origine pour mon application. c'est mon problème.
- Je pense que @AmigableClarkKant est ce qui suggère qu'un cycle d'alimentation peut faire la carte initialiser à partir du firmware. Ne vous contentez pas de redémarrage; la fermeture, d'attendre, de l'alimentation sur. Que peut redémarrer la carte à son adresse MAC d'origine. Ensuite, vous pouvez récupérer et stocker l'adresse MAC d'origine avant de le modifier au moment de l'exécution.
- ohh.... Je n'ai aucune Idée de Comment faire cela de manière Pragmatique.. Il n'y a pas d'autre moyen que je peux l'obtenir à chaque fois que je veux dans ma demande... à l'aide de code C (sans le stocker quelque part)
- C'est une question de "comment faire passer l'information", en supposant qu'il est disponible. Tous les pilotes pour les cartes réseau permettra de savoir comment le faire, mais comme je l'ai décris ci-dessous, l'information est lue puis stockées, et si c'est remplacée plus tard, alors qu'il disparu. Vous pouvez ajouter un peu de code pour chaque pilote, mais ce serait beaucoup de travail, et presque certain de ne pas entrer dans le noyau de Linux, de sorte que vous ne jamais porter un patch pour chaque pilote de réseau disponibles - ce qui serait plutôt beaucoup d'effort pour maintenir...
Vous devez vous connecter pour publier un commentaire.
Certainement dans ethtool 3.1, vous pouvez simplement imprimer l'adresse:
ethtool -P|--show-permaddr nom_périphérique n'Spectacle permanent adresse matérielle
par exemple
Adresse permanente: 94:de:80:6a:21:25
do_permaddr
dansethtool.c
.sudo apt install ethtool
, puis exécutezethtool -P eth0
en tant que root.Essayer
cat /sys/class/net/eth0/address
oucat /sys/class/net/em1/address
si l'utilisation de Fedora. Il devrait fonctionner.L'original de la réponse est ici: Les Notes de l'un des Systèmes d'Admin
La seule façon de trouver l'adresse MAC d'origine est d'utiliser la même méthode que le pilote de carte réseau n'a - malheureusement, je ne crois pas qu'il existe un moyen générique de dire au chauffeur de lui fournir l'adresse MAC "que fournies par le matériel". Bien sûr, il y a des cas où il n'y a pas un matériel carte réseau pour l'interface réseau virtuel pilotes pour la virtualisation et lors de l'utilisation de ponts et les commutateurs logiciels par exemple.
Et bien sûr, le matériel peut être telle que vous ne pouvez pas vraiment lu le "original" adresse MAC quand il a été remplacé par le logiciel, car il n'est qu'un ensemble de registres de l'adresse MAC lui-même.
J'ai eu un coup d'oeil rapide à la pcnet32.c pilotes (parce que c'est l'un des modèles de la carte réseau que j'ai une idée générale de la façon dont il fonctionne et où les différents registres, etc, de sorte que je peux voir ce qu'elle fait). Aussi loin que je peux voir, il ne prend pas en charge la méthode de demander "qu'est-ce que le BAL de l'adresse ethernet" - la lecture de l'adresse MAC au cours de la "probe1" section de l'initialisation du module, et stockés à l'écart. Aucun autre accès à ces registres du matériel est faite.
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 d'extraire à l'aide de
ethtool
où tt:uu:ww:xx:yy:zz est ancienne adresse mac
Cannot get EEPROM data: Operation not supported...
à partir d'une carte wifi sur un LeMaker HiKey peu coûteux ARM64 dispositif de test).Cela peut ne pas être la manière programmatique, mais pourquoi ne pas chercher
dmesg
. Toutes mes machines' Nic cracher l'adresse MAC au temps de détection.Essayer quelque chose comme cela:
Différents Nic afficher l'adresse MAC de façon différente, mais le journal contiendra toujours le noyau donné le nom de la carte (dans la plupart des cas
eth0
ouwlan0
).eth0
. Le noyau n'est pas le gérer; Intel DPDK est. Comment puis-je obtenir l'adresse MAC alors?Cette commande liste tous les périphériques ethernet et original HW adresses.