33

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 ファイルUPREBOOTも問題なく取得できます。オリジナルを見つけるにはどうすればよいですか?それはまだカードに永久に焼き付けられているので、それを見つける方法があるに違いありませんが、焼き付けられたアドレスを読み取るツールが見つかりません。それのためのユーティリティまたはコマンドはありますか?そのための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;
}
4

7 に答える 7

18

cat /sys/class/net/eth0/addressまたはcat /sys/class/net/em1/addressFedora を使用している場合は試してみてください。それはうまくいくはずです。

元の答えはここにあります:システム管理者のメモ

于 2014-06-02T15:05:40.087 に答える
8

元の MAC アドレスを見つける唯一の方法は、ネットワーク カード ドライバーと同じ方法を使用することです。残念ながら、「ハードウェアによって提供される」MAC アドレスを提供するようにドライバーに指示する一般的な方法はないと思います。もちろん、特定のインターフェイス用のハードウェア ネットワーク カードがない場合もあります。たとえば、仮想化用の仮想ネットワーク ドライバーや、ブリッジやソフトウェア スイッチを使用する場合などです。

そしてもちろん、ハードウェアは、ソフトウェアによって上書きされた場合、「元の」MAC アドレスを実際に読み取ることができないようなものである可能性があります。これは、MAC アドレス自体のレジスタ セットが 1 つしかないためです。

pcnet32.c ドライバーをざっと見てみました (これは、ネットワーク カードのモデルの 1 つであり、それがどのように機能するか、さまざまなレジスターがどこにあるかなどを大まかに把握しているため、それが何をするかを確認できます)。私が見る限り、実際に「あなたの PROM イーサネット アドレスは何か」を尋ねる方法はサポートされていません。MAC アドレスは、モジュールの初期化の「probe1」セクションで読み取られ、保存されます。これらのハードウェア レジスタへのそれ以上のアクセスは行われません。

于 2013-02-19T11:21:46.643 に答える
7

古いイーサネット アドレスはカードの 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 アドレスです。

于 2013-02-19T11:20:52.120 に答える
6

これはプログラムによる方法ではないかもしれませんが、検索してみてはいかがでしょうかdmesg。私のマシンのすべての NIC は、検出時に MAC アドレスを吐き出します。

次のようなことを試してください:

dmesg|grep eth0

NIC が異なれば、MAC アドレスの表示も異なりますが、ログには常に、アダプターのカーネル名が含まれます (ほとんどの場合eth0、 またはwlan0)。

于 2014-03-26T05:45:30.217 に答える
-1

このコマンドは、すべてのイーサネット デバイスと元の HW アドレスを一覧表示します。

dmesg | grep eth | grep IRQ | awk {'print "permanent address of " $5 " " $9'} |tr "," " "
于 2016-03-04T12:11:39.967 に答える