2013-02-19 39 views
23

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; 
} 
+2

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. –

+0

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. –

+0

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. –

Trả lời

7

Vâng, địa chỉ ethernet cũ vẫn còn trong các byte đầu tiên của eeprom thẻ (ít nhất là đối với một số loại thẻ), do đó có thể để trích xuất nó bằng cách sử ethtool

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

nơi tt: uu: ww: xx: yy: zz là địa chỉ mac cũ

+0

Điểm tốt ..... –

+1

Tất nhiên, giả sử bạn có quyền truy cập vật lý vào thẻ mạng. Khi tôi thử cùng một thứ trên Fedora 17 dựa trên XEN của tôi [liên quan đến RedHat Linux], ngay cả trong miền đặc quyền, nó nói "Không có dữ liệu EEPROM". –

+0

công cụ này không hữu ích cho trường hợp chung của nó không làm việc cho tôi cũng và vấn đề khác của tôi là tôi không thể sử dụng "sudo" ... !! –

7

Cách duy nhất để tìm địa chỉ MAC ban đầu là sử dụng cùng một phương thức mà trình điều khiển card mạng thực hiện - thật không may, tôi không tin rằng có một cách chung để báo cho trình điều khiển biết địa chỉ MAC của nó "do phần cứng cung cấp" . Tất nhiên, có những trường hợp không có thẻ mạng phần cứng cho giao diện cụ thể đó - trình điều khiển mạng ảo cho ảo hóa và khi sử dụng các cầu nối và chuyển mạch phần mềm chẳng hạn. Và tất nhiên, phần cứng có thể được như vậy mà bạn không thể thực sự đọc địa chỉ MAC "gốc" khi nó đã bị ghi đè bởi phần mềm, bởi vì chỉ có một tập hợp các thanh ghi cho chính địa chỉ MAC đó.

Tôi đã xem nhanh các trình điều khiển pcnet32.c (vì đó là một trong các mô hình của card mạng mà tôi có ý tưởng thô về cách hoạt động và vị trí của các thanh ghi khác nhau, v.v.). Theo như tôi thấy, nó không hỗ trợ phương thức thực sự hỏi "địa chỉ ethernet PROM của bạn" là gì - địa chỉ MAC được đọc trong phần "thăm dò1" của khởi tạo mô-đun và được cất giữ. Không tiếp tục truy cập vào các thanh ghi phần cứng đó.

+0

Vì vậy, cách duy nhất là để vá tất cả các trình điều khiển mạng. Nhưng vì đó là cả * điên rồ * và anh ấy không có sudo, nó không phải là đi. Câu trả lời ngắn: không thể. –

+0

Thậm chí vá tất cả các trình điều khiển mạng sẽ chỉ hoạt động đối với các thẻ mạng REAL HARDWARE. Đó không nhất thiết là những gì "máy" của bạn có nếu nó là một máy ảo, hoặc nếu nó có một số loại xử lý phần mềm mạng lạ hơn sử dụng giao diện mạng phần mềm để thực hiện chuyển đổi/cầu nối/etc. –

+0

Hoàn toàn đúng. –

37

Chắc chắn trong ethtool 3.1 bạn chỉ có thể in địa chỉ: ethtool -P | --show-permaddr địa chỉ DEVNAME Hiện phần cứng vĩnh viễn

ví dụ

ethtool -P eth0 

Địa chỉ thường trú: 94: de: 80: 6a: 21: 25

+3

Câu trả lời hay nhất; để xem mã C, tìm kiếm 'do_permaddr' trong [' ethtool.c'] (http://git.kernel.org/cgit/network/ethtool/ethtool.git/tree/ethtool.c). – bufh

+0

Sau khi các lược đồ đặt tên mới được phát hành: ** ethtool -P wlp1s0 ** hoạt động như một sự thay thế nếu bạn kết nối với wifi – user2925949

5

Điều này có thể không phải là cách chương trình, nhưng tại sao không tìm kiếm dmesg. Tất cả các NIC của máy của tôi đều nhổ ra địa chỉ MAC tại thời điểm phát hiện.

Hãy thử một cái gì đó như thế này:

dmesg|grep eth0 

NIC khác nhau hiển thị địa chỉ MAC khác nhau, nhưng các bản ghi sẽ luôn chứa kernel tên riêng của adapter (trong hầu hết trường hợp eth0 hoặc wlan0).

+0

NIC của tôi thậm chí không có tên giao diện như 'eth0'.Hạt nhân không quản lý nó; Intel DPDK là. Làm thế nào để tôi nhận được địa chỉ MAC sau đó? – sudo

14

Hãy thử cat /sys/class/net/eth0/address hoặc cat /sys/class/net/em1/address nếu sử dụng Fedora. Nó sẽ hoạt động.

Câu trả lời ban đầu là ở đây: Notes of a Systems Admin

+2

Đó không phải là mac cố định/nguyên gốc (nếu nó được thay đổi). Đó là địa chỉ mac tạm thời hoặc hiện tại. –

-1

Lệnh này liệt kê tất cả các thiết bị ethernet và địa chỉ HW ban đầu.

dmesg | grep eth | grep IRQ | awk {'print "permanent address of " $5 " " $9'} |tr "," " " 
Các vấn đề liên quan