現在、MACアドレスを取得するために言及されているすべてのソリューションは、常にeth0を使用しています。しかし、インターフェースがeth0の代わりにeth1で始まるとしたらどうでしょう。また、OS Xでは、インターフェース名が異なります。
インターフェイスeth0も存在する可能性がありますが、使用されていません。つまり、アクティブではなく、IPがありません。
だから、アクティブな最初の利用可能なインターフェースのMACアドレスを取得する方法があります(つまり、inetアドレスを持っていますが、inet6を持っていたくないです)。
例えば
eth0 Link encap:Ethernet HWaddr <some addr>
inet6 addr: <some addr> Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:123
RX packets:123 errors:123 dropped:123 overruns:123 frame:123
TX packets:123 errors:123 dropped:123 overruns:123 carrier:123
collisions:123 txqueuelen:123
RX bytes:123 (123 MB) TX bytes:123 (123 KB)
Interrupt:123 Memory:00000000-00000000
eth1 Link encap:Ethernet HWaddr <some addr>
inet addr:<some addr> Bcast:<some addr> Mask:<some addr>
inet6 addr: <some addr> Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:123 Metric:123
RX packets:123 errors:123 dropped:123 overruns:123 frame:123
TX packets:123 errors:123 dropped:123 overruns:123 carrier:123
collisions:123 txqueuelen:123
RX bytes:123 (123 MB) TX bytes:123 (123 KB)
Interrupt:123 Memory:00000000-00000000
注:出力の値を変更しました。
したがって、この場合、eth0ではなくeth1のHWaddrが必要です。どうやって見つけるの?また、すべてのLinuxフレーバーで動作するはずです。
インターフェイス名とMACアドレスは、先頭に空白がない行の最初と最後のフィールドであることに注意してください。
インデントされた行の1つにinet addr:
が含まれる場合、最新のインターフェイス名とMACアドレスが出力されます。
ifconfig -a |
awk '/^[a-z]/ { iface=$1; mac=$NF; next }
/inet addr:/ { print iface, mac }'
複数のインターフェースが基準を満たす可能性があることに注意してください。次に、スクリプトは複数の行を印刷します。 (常に最初の一致のみを印刷したい場合は、; exit
を最後の閉じ括弧の直前に追加できます。)
次のようにできます
ifconfig <Interface ex:eth0,eth1> | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'
また、次のようにすべてのインターフェイスのMACを取得できます
cat /sys/class/net/*/address
Eth0のような特定のインターフェース用
cat /sys/class/net/eth0/address
Linux固有の最適なソリューションは、sysfsを使用することです。
$ IFACE=eth0
$ read MAC </sys/class/net/$IFACE/address
$ echo $IFACE $MAC
eth0 00:ab:cd:12:34:56
read
は非BASHシェルを含むPOSIXシェルの組み込みコマンドであるため、このメソッドは他のメソッドと比較して非常にクリーンであり、追加のプロセスを生成しません。ただし、OS Xへの移植性が必要な場合は、ifconfig
およびsed
メソッドを使用する必要があります。OSXにはsysfsのような仮想ファイルシステムインターフェイスがないためです。
$ ip route show default | awk '/default/ {print $5}'
return:eth0(私のオンラインインターフェイス)
$ cat /sys/class/net/$(ip route show default | awk '/default/ {print $5}')/address
return:ec:a8:6b:bd:55:05(eth0のMACアドレス、私のオンラインインターフェイス)
最新のGNU/Linuxシステムでは、次のことができます利用可能なネットワークインターフェイスを参照/sys/class/net/
、 例えば:
$ ls /sys/class/net/
enp0s25 lo virbr0 virbr0-nic wlp2s0
インターフェイスがup
デバイスディレクトリ内のoperstate
であるかどうかを確認できます。たとえば、次のようにしてenp0s25
はアップしています:
$ cat /sys/class/net/enp0s25/operstate
up
次に、MACアドレスの取得を使用して、そのインターフェイスを取得できます。
$ cat /sys/class/net/enp0s25/address
ff:00:ff:e9:84:a5
たとえば、アクティブなインターフェイスのMACアドレスを出力する単純なbashスクリプトを次に示します。
#!/bin/bash
# getmacifup.sh: Print active NICs MAC addresses
D='/sys/class/net'
for nic in $( ls $D )
do
echo $nic
if grep -q up $D/$nic/operstate
then
echo -n ' '
cat $D/$nic/address
fi
done
そして、イーサネットと無線LANインターフェースを備えたシステムでの出力は次のとおりです。
$ ./getmacifup.sh
enp0s25
ff:00:ff:e9:84:a5
lo
wlp2s0
詳細については、 Kernel documentation をご覧ください
また、2015年以降、ほとんどのGNU/Linuxディストリビューションはsystemd
に切り替えられ、ethX
インターフェイスの命名スキームを使用しなくなったことを思い出してください。見る:
ああ、mac ether macアドレスだけが必要な場合は、それを使用できます。
ifconfig | grep "ether*" | tr -d ' ' | tr -d '\t' | cut -c 6-42
(Macintoshで動作)
ifconfig
-すべての情報を取得grep
-行をアドレスで保持しますtr
-すべて削除cut
-「ether」を削除して、アドレスのみを持つようにします単に実行:
ifconfig | grep ether | cut -d " " -f10
OR
ip a | grep ether | cut -d " " -f6
これらの2つのコマンド例は、すべての行を「エーテル」文字列でgrepし、grepされた部分の番号スペース(-fオプションで指定)に続く(必要な)macアドレスをカットします。
さまざまなLinuxフレーバーでテスト済み
私のデバイスはbalance-rr結合であるため、上記のいずれも機能しませんでした。クエリすると、ip l l
、ifconfig
、または/sys/class/net/${device}/address
で同じMACアドレスが使用されるため、そのうちの1つが正しく、1つが不明です。
しかし、これはデバイスの名前を変更していない場合に機能します(私が見逃したものに関するヒントはありますか?):
udevadm info -q all --path "/sys/class/net/${device}"
また、名前を変更しても機能します(例:ip l set name x0 dev p4p1
):
cat /proc/net/bonding/bond0
または、より解析しやすくするいスクリプト(テストされていないドライバー/ OS /互換性):
awk -F ': ' '
$0 == "" && interface != "" {
printf "%s %s %s\n", interface, mac, status;
interface="";
mac=""
};
$1 == "Slave Interface" {
interface=$2
};
$1 == "Permanent HW addr" {
mac=$2
};
$1 == "MII Status" {
status=$2
};
END {
printf "%s %s %s\n", interface, mac, status
}' /proc/net/bonding/bond0
上記のリストが機能しない場合の代替回答を次に示します。 here で見つかった次のソリューションも使用できます。
ip addr
OR
ip addr show
OR
ip link
これらの3つはすべて、link/ether
の横にMACアドレスを表示します。インターネットにアクセスせずにUSBスティックからDebian 9.5を新たにインストールしたばかりだったため、つまずいたので、非常に最小限のインストールしかできず、
-bash: ifconfig: command not found
上記のソリューションのいくつかを試したとき。他の誰かがこの問題に出くわすかもしれないと考えました。それが役に立てば幸い。
私はそれが少し古くなっていることを知っていますが、基本的なコマンドを使用して、インターフェイスのMACアドレスを取得できます:
ip link show eth0 | grep link/ether | awk '{print $2}'
良い一日を!