Os: RedHat Linux Linux quản lý: 2.6.18.8-1 #Tìm địa chỉ MAC gốc từ bản thân phần cứng
Đây có phải là có thể đọc MAC dạng địa chỉ NIC trực tiếp? Tôi có mã dưới đây nhưng nó chỉ đọc từ trên lớp nhưng không phải là thẻ chính nó !!!
Tôi đang cố gắng tìm ra cách tìm địa chỉ MAC ban đầu của NIC ethernet trên hộp linux của tôi. Tôi hiểu cách tìm địa chỉ MAC hiện tại bằng ifconfig, nhưng nếu địa chỉ đã bị thay đổi, hãy sử dụng 'ifconfig eth0 hw ether uu:vv:ww:yy:xx:zz'
hoặc tôi đặt "vĩnh viễn" bằng cách sử dụng vi /etc/sysconfig/network-scripts/ifcfg-eth0
.tệp này ... Tôi có thể thành công UP
trong địa chỉ REBOOT
. làm cách nào để tìm bản gốc? Phải có một cách để tìm nó, bởi vì nó vẫn còn bị đốt cháy vĩnh viễn vào thẻ, nhưng tôi không thể tìm thấy một công cụ để đọc các đốt cháy trong địa chỉ. là có bất kỳ tiện ích cho nó hoặc lệnh cho nó? Tôi giả sử viết mã C cho nó. nhưng không biết làm thế nào để làm điều này trong trường hợp trên.
** mã dưới đây mang đến cho hiện MAC của tôi nhưng không phải gốc 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;
}
Chỉ vì nó được ghi ở đó, không có nghĩa là nó có sẵn. Tôi không biết làm thế nào Linux và các thẻ làm việc, nhưng nó sẽ là hoàn toàn hợp lý nếu MAC chỉ được khôi phục trên một chu kỳ điện khi firmware của thẻ không khởi tạo. –
Tôi chỉ muốn UP máy của tôi với SPOOFED MAC và tôi có thể làm điều đó thành công. nhưng trong thời gian đó tôi muốn MAC ban đầu cho ứng dụng của mình. đó là vấn đề của tôi. –
Tôi nghĩ @AmigableClarkKant đang gợi ý rằng một chu kỳ công suất đầy đủ có thể làm cho NIC khởi tạo từ phần sụn. Đừng chỉ khởi động lại; tắt máy, chờ, bật nguồn. Điều đó có thể khởi động lại NIC với địa chỉ MAC ban đầu của nó. Sau đó, bạn có thể truy xuất và lưu trữ địa chỉ MAC ban đầu * trước * bạn thay đổi nó tại thời gian chạy. –