1. 概要

このチュートリアルでは、メディアアクセス制御(MAC)アドレスについて説明し、ネットワークインターフェイスのMACアドレスを見つける方法を学習します。

2. MACアドレスとは何ですか?

メディアアクセス制御(MAC)アドレスは、ハードウェアアドレスとも呼ばれます。 これは、ネットワークアダプタまたはネットワークインターフェイスカード(NIC)に関連付けられた一意の値です。

MACアドレスは、コロンで区切られた6組の16進数で表される48ビットで構成されます。 00:0c:29:cc:55:5e。

すべてのNICには少なくとも1つのMACアドレスがありますが、マルチポートNICには各ポートのMACアドレスがあります

さらに、MACアドレスはデバイスドライバーによって自動的に検出されます。 次に、カードはそれを使用して、データの送信元と送信先を決定します。

使用されるMACアドレスの例は、接続されたクライアントへのIPアドレスの制限と割り当ての両方に使用するDHCPサーバーです。

3. MACアドレスの検索

このセクションでは、MACアドレスを見つけるための2つの方法を見ていきます。

3.1. ipコマンドの使用

ip コマンドを使用して、コンピューターのNICのMACアドレスを見つけましょう。

$ ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 00:0c:29:cc:55:5e brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.99.91/24 brd 192.168.99.255 scope global dynamic noprefixroute ens33
       valid_lft 6999sec preferred_lft 6999sec
    ... truncated ...

または、このコマンドを ip addr show に短縮することも、 ipaに短縮することもできます。

デフォルトでは、非常に冗長で、構成されているすべてのネットワークデバイスの情報が表示されます。 show オプションの後にネットワークインターフェイスを指定することで、出力を減らすことができます。

$ ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 00:0c:29:cc:55:5e brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.99.91/24 brd 192.168.99.255 scope global dynamic noprefixroute ens33
       valid_lft 4975sec preferred_lft 4975sec
    ... truncated ...

実際にはMACアドレスに関心があるので、 ipコマンドをgrep、と組み合わせて、 shows:に短縮することもできます。

$ ip a s ens33 | grep ether
    link/ether 00:0c:29:cc:55:5e brd ff:ff:ff:ff:ff:ff

ここでは、NICのMACアドレスが00:0c:29:cc:55:5eであることがわかります。

3.2. ifconfigコマンドの使用

ifconfig は、ipコマンドと同様のコマンドです。 利用可能なすべてのインターフェイスの情報が表示されます。

$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.99.91  netmask 255.255.255.0  broadcast 192.168.99.255
        inet6 2a03:7847:2252:199:7dd2:e1f0:6395:9f7  prefixlen 64  scopeid 0x0<global>
        inet6 2a03:7847:2252:199:9589:759e:2e6f:df28  prefixlen 64  scopeid 0x0<global>
        inet6 2a03:7847:2252:199::8bbb  prefixlen 128  scopeid 0x0<global>
        inet6 fe80::6678:3fc6:cb2f:15bb  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:cc:55:5e  txqueuelen 1000  (Ethernet)
        ... truncated ...

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        ... truncated ...

ここでもgrepを使用して、MACアドレスのみを取得できます。

$ ifconfig | grep ether
ether 00:0c:29:cc:55:5e  txqueuelen 1000  (Ethernet)

4. シェル変数へのMACアドレスの保存

場合によっては、シェルスクリプトなどでさらに処理するためにアドレスが必要になることがあります。 それを行うためのいくつかの方法を見てみましょう。

4.1. grepを使用してMACアドレスを抽出します

MACアドレスがコロンで区切られた16進数の6つのブロックで構成されているという事実を利用して、単純な正規表現または正規表現を使用できます。

$ ifconfig ens33 | grep -o -E ..:..:..:..:..:..
00:0c:29:cc:55:5e

これはMACアドレスのみを返すため、変数に格納できます。

$ MYMAC=`ifconfig ens33 | grep -o -E ..:..:..:..:..:..`
$ echo $MYMAC
00:0c:29:cc:55:5e

ipコマンドについても同じことが言えます。

$ MYMAC=`ip a s ens33 | grep -o -E ..:..:..:..:..:..`
$ echo $MYMAC
00:0c:29:cc:55:5e ff:ff:ff:ff:ff:ff

しかし、結果は私たちが期待したほどきれいではありません。 したがって、より複雑な正規表現を使用するか、別のツールを使用することができます。

4.2. grepawkを使用してMACアドレスを抽出します

上記の方法をawkと組み合わせると、期待どおりの結果が得られます。

$ MYMAC=`ip add | grep link/ether | awk '{print $2}'`
$ echo $MYMAC
00:0c:29:cc:55:5e

5. 結論

この記事では、ipまたはifconfigを使用してネットワークインターフェイスのMACアドレスを検索する方法について説明しました。 また、grepまたはgrepawkの組み合わせを使用して、スクリプト作成中にさらに処理するために変数に簡単に割り当てる方法も学びました。