una saber otro obtener mac kali direccion como comando celular address linux sockets linux-kernel linux-device-driver mac-address

linux - saber - obtener mac centos



Encontrar la dirección MAC original del Hardware mismo (6)

Os: REDHAT LINUX Linux administra: 2.6.18.8-1 #

¿Es posible leer la dirección MAC desde NIC directamente? Tengo el código siguiente, pero solo leí desde la capa superior pero no la tarjeta en sí.

Estoy tratando de encontrar la forma de encontrar la dirección MAC original de una NIC de ethernet en mi Linux Box. Entiendo cómo encontrar la dirección MAC actual usando ifconfig, pero si la dirección ha sido modificada, digamos usando ''ifconfig eth0 hw ether uu:vv:ww:yy:xx:zz'' , o configuré "permanent" usando vi /etc/sysconfig/network-scripts/ifcfg-eth0 archivo ... Puedo vi /etc/sysconfig/network-scripts/ifcfg-eth0 éxito también en REBOOT . ¿Cómo encuentro el original? Debe haber una manera de encontrarlo, porque todavía está grabado de forma permanente en la tarjeta, pero no puedo encontrar una herramienta para leer la dirección quemada. ¿hay alguna utilidad o comando para ello? Supongo que debo escribir el código C para eso. pero no sé cómo hacer esto en el caso anterior.

** debajo del código da mi MAC actual pero MAC no original

#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; }


Bueno, la antigua dirección de ethernet permanece en los primeros bytes del eeprom de la tarjeta (al menos para algunos tipos de tarjetas), por lo que es posible extraerla usando ethtool

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

donde tt: uu: ww: xx: yy: zz es dirección MAC antigua


Ciertamente, en ethtool 3.1 puede imprimir la dirección: ethtool -P | --show-permaddr DEVNAME Mostrar dirección de hardware permanente

p.ej

ethtool -P eth0

Dirección permanente: 94: de: 80: 6a: 21: 25


Esta puede no ser la forma programática, pero ¿por qué no buscar dmesg ? Todos los NICs de mi máquina escupieron la dirección MAC en el momento de la detección.

Pruebe algo como esto:

dmesg|grep eth0

Diferentes NIC muestran la dirección MAC de manera diferente, pero el registro siempre contendrá el nombre del núcleo del adaptador (en la mayoría de los casos, eth0 o wlan0 ).


Este comando enumera todos los dispositivos de Ethernet y las direcciones HW originales.

dmesg | grep eth | grep IRQ | awk {''print "permanent address of " $5 " " $9''} |tr "," " "


La única forma de encontrar la dirección MAC original es usar el mismo método que el controlador de la tarjeta de red: desafortunadamente, no creo que haya una manera genérica de decirle al controlador que proporcione su dirección MAC "tal como lo proporciona el hardware". Por supuesto, hay casos en los que no existe una tarjeta de red de hardware para esa interfaz en particular: controladores de red virtual para virtualización y cuando se utilizan puentes y conmutadores de software, por ejemplo.

Y, por supuesto, el hardware puede ser tal que no se puede leer la dirección MAC "original" cuando el software lo sobrescribe, ya que solo hay un conjunto de registros para la dirección MAC.

Eché un vistazo rápido a los controladores pcnet32.c (porque es uno de los modelos de tarjeta de red que tengo una idea aproximada de cómo funciona y dónde están los diferentes registros, etc., así puedo ver lo que hace). Por lo que puedo ver, no admite ningún método para preguntar "¿cuál es su dirección de red PROM?" - la dirección MAC se lee durante la sección "sonda1" de la inicialización del módulo y se almacena. No se realiza ningún otro acceso a esos registros de hardware.