鋨:REDHAT LINUX的Linux管理:2.6.18.8-1#從硬件本身查找原始MAC地址
這是可以直接讀取MAC地址形式網卡?我有下面的代碼,但它只是從上面的層讀取,但不是卡本身!
我想弄清楚如何在我的linux機器上找到以太網網卡的原始MAC地址。我知道如何使用ifconfig找到當前的MAC地址,但是如果地址已被改變,比如說使用 'ifconfig eth0 hw ether uu:vv:ww:yy:xx:zz'
,或者我使用vi /etc/sysconfig/network-scripts/ifcfg-eth0
這個文件設置了「永久」。我可以成功地在REBOOT
中也得到UP
。我如何找到原件?必須有辦法找到它,因爲它仍然被永久性地燒入卡片中,但我找不到一個工具來讀取刻錄地址。 是否有任何實用工具或命令? 我想爲它編寫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;
}
只因爲它在那裏被燒燬,並不意味着它必須可用。我不知道linux和卡片是如何工作的,但是如果MAC只在電源週期中恢復,那麼當卡片的固件初始化時,這將是完全合理的。 – 2013-02-19 10:53:26
我只想用SPOOFED MAC來啓動我的機器,我可以成功地完成它。但在此期間,我希望我的原始MAC用於我的應用程序。那是我的問題。 – 2013-02-19 11:09:48
我認爲@AmigableClarkKant暗示完整的電源週期可能會使NIC從固件初始化。不要只是重新啓動;關機,等待,開機。這可能會以其原始MAC地址重新啓動NIC。然後,您可以在運行時更改它之前檢索並存儲原始MAC地址*。 – 2013-02-19 11:19:34