シェルスクリプトを使ってmacOS上で有効になっている物理ネットワークデバイス名を取得する

2023-03-27Bash,Mac

はじめに

非常に限定されたシチュエーションに関する内容です。

macOS プラットフォームに限定ですが、現在接続中の無線/有線ネットワークデバイスを抽出したいという相談がありました。

「なるほどそういう要件もあるのだな」と思うと同時に興味深かったため、対応方法を考えてみました。

検証環境

$ uname -v
Darwin Kernel Version 21.6.0: Sat Jun 18 17:07:22 PDT 2022; root:xnu-8020.140.41~1/RELEASE_ARM64_T6000

$ bash -version | head -n 1
GNU bash, バージョン 5.1.16(1)-release (aarch64-apple-darwin21.1.0)

networksetup コマンドを利用する

macOS 上のネットワークインタフェースを操作するためのコマンドとして、 networksetup があります。

こちらのコマンドには様々なオプションが用意されています。

まずは networksetup --listallhardwareports を使って、ネットワークインタフェースハードウェアを一覧出力できます。

$ networksetup -listallhardwareports

Hardware Port: Ethernet Adapter (en4)
Device: en4
Ethernet Address: d2:d6:53:14:xx:xx

Hardware Port: Ethernet Adapter (en5)
Device: en5
Ethernet Address: d2:d6:53:14:xx:xx

Hardware Port: Ethernet Adapter (en6)
Device: en6
Ethernet Address: d2:d6:53:14:xx:xx

Hardware Port: Wi-Fi
Device: en0
Ethernet Address: bc:d0:74:1a:xx:xx

Hardware Port: Thunderbolt 1
Device: en1
Ethernet Address: 36:dd:b7:8d:xx:xx

Hardware Port: Thunderbolt 2
Device: en2
Ethernet Address: 36:dd:b7:8d:xx:xx

Hardware Port: Thunderbolt 3
Device: en3
Ethernet Address: 36:dd:b7:8d:xx:xx

Hardware Port: Thunderbolt Bridge
Device: bridge0
Ethernet Address: 36:dd:b7:8d:xx:xx

VLAN Configurations
===================

それぞれのネットワークハードウェアが 3 行のまとまりで出力されています。

個別のハードウェアがネットワーク接続のために利用されているかを判定するために、 networksetup -getinfo <HARDWARE_PORT> を使って情報を取得できます。

# 引数として、先程一覧表示した "Hardware Port" のいずれかを指定します
$ networksetup -getinfo "Wi-Fi"
DHCP Configuration
IP address: 192.168.1.13
Subnet mask: 255.255.255.0
Router: 192.168.1.1
Client ID:
IPv6: Automatic
IPv6 IP address: none
IPv6 Router: none
Wi-Fi ID: bc:d0:74:1a:xx:xx

# こちらはネットワーク接続されていない "Hardware Port"
$ networksetup -getinfo "Ethernet Adapter (en4)"
DHCP Configuration
Client ID:
IPv6: Automatic
IPv6 IP address: none
IPv6 Router: none
Ethernet Address: d2:d6:53:14:xx:xx

IP address に IP アドレスが割り当てられているかどうかでネットワーク接続済みのインタフェースか判定できそうです。

現在接続中の無線/有線ネットワークデバイスを抽出

ここまで見てきた networksetup -listallhardwareportsnetworksetup -getinfo を組み合わせて、ネットワーク接続済みのハードウェアを抽出してみます。

$ networksetup -listallhardwareports \
  | sed -n 's/^Hardware Port: //p' \
  | while read -r DEVICE; do
    grep -q 'IP address: [0-9.]\+$' <(networksetup -getinfo $DEVICE) \
      && echo "$DEVICE"
  done

Wi-Fi

僕の環境では、 "Wi-Fi" 接続だけが有効になっていました。
USBThunderbolt 経由で LAN ケーブルを接続している場合には、対象のハードウェア名も表示されます。

名前だけでなく、ネットワーク接続情報も合わせて出力したい場合は以下のようになります。

$ networksetup -listallhardwareports \
  | sed -n 's/^Hardware Port: //p' \
  | while read -r DEVICE; do
    grep -q '^IP address: .\+$' <(networksetup -getinfo $DEVICE) \
      && {
        echo "Hardware Port: $DEVICE"
        networksetup -getinfo $DEVICE
      }
  done

Hardware Port: Wi-Fi
DHCP Configuration
IP address: 192.168.1.13
Subnet mask: 255.255.255.0
Router: 192.168.1.1
Client ID:
IPv6: Automatic
IPv6 IP address: none
IPv6 Router: none
Wi-Fi ID: bc:d0:74:1a:xx:xx

ひとこと

ネットワーク接続済みの物理インタフェース(Hardware Port)がわかれば、 networksetup コマンドで更に色々(例えば強制的に接続を切断するなど)できます。

2023-03-27Bash,Mac