Подтвердить что ты не робот

Поиск исходного MAC-адреса из самого оборудования

Os: REDHAT LINUX Linux управляет: 2.6.18.8-1 #

Возможно ли прямое считывание формы MAC-адреса NIC? У меня есть код ниже, но он просто читается сверху, но не сама карта.

Я пытаюсь выяснить, как найти исходный MAC-адрес сетевого сетевого адаптера в моем linux-окне. Я понимаю, как найти текущий MAC-адрес, используя ifconfig, но если адрес был изменен, скажем, используя 'ifconfig eth0 hw ether uu:vv:ww:yy:xx:zz', или я установил "постоянный" его, используя vi /etc/sysconfig/network-scripts/ifcfg-eth0. этот файл... Я также могу успешно UP его в REBOOT. как найти оригинал? Должен быть способ найти его, потому что он все еще постоянно горит на карточке, но я не могу найти инструмент для чтения сгоревшего в адресе. есть ли какая-нибудь утилита для него или команда для этого? Я предполагаю написать для него код C. но не знаю, как это сделать в приведенном выше случае.

** ниже код дает мой текущий MAC, но не оригинальный 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;
}
4b9b3361

Ответ 1

Конечно, в ethtool 3.1 вы можете просто распечатать адрес: ethtool -P | --show-permaddr DEVNAME Показать постоянный адрес аппаратного обеспечения

например.

ethtool -P eth0

Постоянный адрес: 94: de: 80: 6a: 21: 25

Ответ 3

Единственный способ найти исходный MAC-адрес - использовать тот же метод, который делает драйвер сетевой карты - к сожалению, я не верю, что существует общий способ сообщить драйверу предоставить ему MAC-адрес ", как это предусмотрено аппаратное обеспечение". Конечно, бывают случаи, когда нет аппаратной сетевой карты для этого конкретного интерфейса - виртуальные сетевые драйверы для виртуализации и, например, при использовании мостов и программных переключателей.

И, конечно же, аппаратное обеспечение может быть таким, что вы не можете читать "оригинальный" MAC-адрес, когда он был перезаписан программным обеспечением, потому что для самого MAC-адреса существует только один набор регистров.

Я быстро посмотрел на драйверы pcnet32.c(потому что это одна из моделей сетевой карты, в которой я имею общее представление о том, как она работает и где находятся разные регистры и т.д., поэтому я могу видеть, что она делает), Насколько я вижу, он не поддерживает метод фактического запроса "что такое адрес сети PROM" - MAC-адрес считывается в разделе "probe1" инициализации модуля и сохраняется. Отсутствует доступ к этим аппаратным регистрам.

Ответ 4

Ну, старый адрес ethernet остается в первых байтах карты eeprom (по крайней мере для некоторых типов карт), поэтому его можно извлечь с помощью ethtool

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

где tt: uu: ww: xx: yy: zz - старый адрес mac

Ответ 5

Это не может быть программным способом, но почему бы не искать dmesg. Все сетевые платы моих компьютеров выталкивают MAC-адрес во время обнаружения.

Попробуйте что-то вроде этого:

dmesg|grep eth0

Различные сетевые карты отображают MAC-адрес по-разному, но журнал всегда будет содержать указанное имя ядра адаптера (в большинстве случаев eth0 или wlan0).

Ответ 6

В этой команде перечислены все сетевые устройства и оригинальные HW-адреса.

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