(今更)Linux で HW(MAC)アドレスを取得する方法


RaspberryPI シリーズに DHCP を利用して固定 IP を割り当てたり、WiFi の AP で MAC アドレスフィルタリングをしたいと思ったときに必要となるのが NIC の HWアドレス(MACアドレス)。ということでまとめ。

結果を見たいだけの時

(出力結果の IPv4/MAC アドレス部分は適当に改変しています)

旧来のコマンド(ifconfig)

シェルスクリプトなどで再利用したい場合には下記の結果の 'ether' で始まる行を grep して sed するなり awk するなり cut すればよい。


[hoge@fuga ~]$ /sbin/ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.34.56  netmask 255.255.255.0  broadcast 192.168.34.255
        ether XX:YY:ZZ:PP:QQ:RR  txqueuelen 1000  (イーサネット)
        RX packets 110242  bytes 12368079 (11.7 MiB)
        RX errors 0  dropped 1  overruns 0  frame 0
        TX packets 7611  bytes 1440299 (1.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • 最近はこのコマンドがデフォルトでインストールされていないディストリビューションも多い
  • たとえインストールされていても、/sbin や /usr/sbin 配下にいることが多いため、一般ユーザーでログインしているときは PATH が通っていないことも(但しsudo するなりフルパス指定で起動すれば問題ない)
  • 上記二つの理由から、私としては下記の ip コマンドの利用を推奨。

新しめのコマンド(ip)

シェルスクリプトなどで再利用したい場合は ifconfig コマンド同様、'link/ether' で始まる行を grep なり tail -n 1 して以下略

[hoge@fuga ~]$ /bin/ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether XX:YY:ZZ:PP:QQ:RR brd ff:ff:ff:ff:ff:ff
  • /bin か /usr/bin にいるはずなので誰でも実行可能
  • 無駄な出力は少な目

論外(dmesg コマンドをデバイス名で grep )

Linux のブートログを漁る方法。
一般的にネットワーク関連デバイスのデバイスドライバは、読み込まれた時点でブートログに MAC アドレスを吐き出すことが多い。
ただ、物によっては MAC をログに吐き出さないデバイスドライバもある(RaspberryPI3 の WiFi てめぇだ)上に、デバイス/ディストリビューションに依存して出力形式も多種多様なのでこれは論外。

シェルスクリプト内で、余分な出力なしで MAC アドレスのみを探る時

ifconfig コマンドにせよ ip コマンドにせよ、バージョンアップで出力形式が変更されたら即アウトなので
上記コマンドの出力結果をゴニョゴニョして自作スクリプト内で再利用することはあまりお勧めできない。
ということで実はここからが本題。ワンライナー一撃。

[hoge@fuga ~]$ cat `find /sys/devices/ -name eth0`/address
XX:YY:ZZ:PP:QQ:RR
[hoge@fuga ~]$
  • 出力結果を grep する必要もなければ sed とか cut といったコマンドにパイプ処理する必要もないので、各種コマンドのオプションを知る必要もなし。
  • 追加インストールなしのコマンドだけでできるのでディストリビューション不問
  • まずないとは思いますが、指定されたデバイス名(この例だとeth0)に一致するサブディレクトリが複数存在している場合だけ要注意(そんなときは head/tail コマンドでどうにかしてください)
  • (2019/04/04 コメントを頂戴したので追記) デバイスドライバとしてファームウェアを利用するホスト上で、一般ユーザーが実行するとデバイスツリーの一部を読み取れないことに起因するアクセスエラーが標準エラーに出力される。その場合は
[hoge@fuga ~]$ cat `find /sys/devices/ -name eth0 2>/dev/null`/address
XX:YY:ZZ:PP:QQ:RR
[hoge@fuga ~]$

に変えてください

以上