web-dev-qa-db-ja.com

ハードウェア自体から元のMACアドレスを見つける

Os:REDHAT LINUX Linux管理:2.6.18.8-1#

これはMACアドレス形式NICを直接読み取ることは可能ですか?以下のコードがありますが、カード自体ではなく、上の層から読み取るだけです!!!

私は、Linuxボックス上でイーサネットNICの元のMACアドレスを見つける方法を見つけようとしています。 ifconfigを使用して現在のMACアドレスを見つける方法はわかりますが、アドレスが変更された場合、たとえば'ifconfig eth0 hw ether uu:vv:ww:yy:xx:zz'を使用するか、vi /etc/sysconfig/network-scripts/ifcfg-eth0。thisファイルを使用して「永続的」に設定します... UPにも正常にREBOOT it。オリジナルを見つけるにはどうすればよいですか?まだカードに永続的に書き込まれているため、それを見つける方法が必要になりますが、書き込まれたアドレスを読み取るツールが見つかりません。そのためのユーティリティやコマンドはありますか?私はそれのためにCコードを書くと思います。しかし、上記の場合、これを行う方法がわかりません。

**以下のコードは、mycurrentMACを提供しますが、元の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;
}
30
Jatin Bodarya

確かにethtool 3.1では、アドレスを印刷するだけです:ethtool -P | --show-permaddr DEVNAME Show permanent hardware address

例えば.

ethtool -P eth0

常設住所:94:de:80:6a:21:25

51
Jason Morgan

cat /sys/class/net/eth0/addressまたはcat /sys/class/net/em1/address Fedoraを使用している場合。動作するはずです。

元の答えはこちらです: システム管理者の注意

16
tver3305

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

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

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

8
Mats Petersson

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

7
begemotv2718

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

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

dmesg|grep eth0

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

6
user3462738