web-dev-qa-db-ja.com

シェルスクリプトを使用してMACアドレスを取得する

現在、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フレーバーで動作するはずです。

22
Pratham

インターフェイス名とMACアドレスは、先頭に空白がない行の最初と最後のフィールドであることに注意してください。

インデントされた行の1つにinet addr:が含まれる場合、最新のインターフェイス名とMACアドレスが出力されます。

ifconfig -a |
awk '/^[a-z]/ { iface=$1; mac=$NF; next }
    /inet addr:/ { print iface, mac }'

複数のインターフェースが基準を満たす可能性があることに注意してください。次に、スクリプトは複数の行を印刷します。 (常に最初の一致のみを印刷したい場合は、; exitを最後の閉じ括弧の直前に追加できます。)

10
tripleee

次のようにできます

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
54
Jayesh Bhoi

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のような仮想ファイルシステムインターフェイスがないためです。

35
Dave
$ 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アドレス、私のオンラインインターフェイス)

端末イメージ

25
Elismar Luz

最新の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インターフェイスの命名スキームを使用しなくなったことを思い出してください。見る:

16
gerlos

ああ、mac ether macアドレスだけが必要な場合は、それを使用できます。

ifconfig | grep "ether*" | tr -d ' ' | tr -d '\t' | cut -c 6-42

(Macintoshで動作)

  • ifconfig-すべての情報を取得
  • grep-行をアドレスで保持します
  • tr-すべて削除
  • cut-「ether」を削除して、アドレスのみを持つようにします
3
MajorTom

単に実行:

ifconfig | grep ether | cut -d " " -f10

OR

ip a | grep ether | cut -d " " -f6

これらの2つのコマンド例は、すべての行を「エーテル」文字列でgrepし、grepさ​​れた部分の番号スペース(-fオプションで指定)に続く(必要な)macアドレスをカットします。

さまざまなLinuxフレーバーでテスト済み

1

私のデバイスはbalance-rr結合であるため、上記のいずれも機能しませんでした。クエリすると、ip l lifconfig、または/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
1
Peter

上記のリストが機能しない場合の代替回答を次に示します。 here で見つかった次のソリューションも使用できます。

ip addr

OR

ip addr show

OR

ip link

これらの3つはすべて、link/etherの横にMACアドレスを表示します。インターネットにアクセスせずにUSBスティックからDebian 9.5を新たにインストールしたばかりだったため、つまずいたので、非常に最小限のインストールしかできず、

-bash: ifconfig: command not found

上記のソリューションのいくつかを試したとき。他の誰かがこの問題に出くわすかもしれないと考えました。それが役に立てば幸い。

0
sk8forether

私はそれが少し古くなっていることを知っていますが、基本的なコマンドを使用して、インターフェイスのMACアドレスを取得できます:

ip link show eth0 | grep link/ether | awk '{print $2}'

良い一日を!

0
Murdok