Os:REDHAT LINUX Linux 管理: 2.6.18.8-1 #
NIC から MAC アドレスを直接読み取ることはできますか? 以下のコードがありますが、カード自体ではなく、レイヤーの上から読み取るだけです!!!
Linux ボックスでイーサネット NIC の元の MAC アドレスを見つける方法を見つけようとしています。ifconfig を使用して現在の MAC アドレスを見つける方法は理解していますが、たとえば を使用してアドレスが変更された場合
'ifconfig eth0 hw ether uu:vv:ww:yy:xx:zz'
、または .this ファイルを使用して「永続的」に設定した場合は、 vi /etc/sysconfig/network-scripts/ifcfg-eth0
.this ファイル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;
}