シェルスクリプトを使ってmacOS上で有効になっている物理ネットワークデバイス名を取得する
はじめに
非常に限定されたシチュエーションに関する内容です。
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 -listallhardwareports
と networksetup -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" 接続だけが有効になっていました。
USB や Thunderbolt 経由で 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
コマンドで更に色々(例えば強制的に接続を切断するなど)できます。
ディスカッション
コメント一覧
まだ、コメントがありません