Linux から認識されている、すべてのネットワークインターフェイス名だけを取得する


10年以上前であれば、「このデバイスドライバを使う NIC のデバイス名は xxx0 xxx1 ・・・になる 」と決め打ちできたものでした。しかし、udev の登場+各ディストリビューションがそれぞれ独自に udev 向けネーミングルールを設定し始めたことで、新規にOSをインストールする前の段階で「特定ネットワークデバイス名が最終的にどのような名前になるか」を予測することはほぼ不可能1になりました。それによって10年以上前に作成された、デバイス名を決め打ち+ハードコーディングされていたシェルスクリプトや各種設定ファイルは全滅したわけです(・ω・)
端的に言えば、他の環境での実行も考慮しなければならないスクリプトなり設定ファイルなりを作り込む際には、実行環境下でOSが認識しているネットワークデバイス名を逐次取得する必要が出てきている、というわけですね。

ふつーの方法

確認したいだけならば ifconfig とか ip コマンドの出力を見れば良い。
シェルスクリプトの中で使いたい場合はやっぱりワンライナーで。
それは以下の方法で。

仮想/物理/論理すべてのデバイス名を取得するとき

Linux から見ればネットワークへの入口/出口でしかない「ネットワークインターフェース」ですが、その実態はループバックやらPPP接続、果ては複数NICを纏めたボンディング、ブリッジなど、マシンに物理的に刺さっているネットワークカードとは関係ないインターフェースも多数存在するわけです。

それらの名前を一覧表示させるコマンドがこちら

[hoge@fuga ~]$ ls /sys/class/net/
eth0  eth1  lo  ppp0
[hoge@fuga ~]$

上記の例は Linux ルータ上で実行した結果なので
ループバック、NIC が2枚(eth0/eth1)、PPP デバイスが存在します。

実際に接続されているネットワークカードの認識名のみを取得するとき

上に挙げたコマンドを実行すると、ループバックやPPPといった、ソフトウェア的に定義され、MAC アドレスを持たない論理インターフェースも含まれてしまいますが、MACアドレスを調べたいときなど、物理的にマシンに刺さっているデバイス名だけがほしい、という状況はままあります。そんなときは次のコマンド。

# ループバックを除外するために grep -v している
[hoge@fuga ~]$ for DEV in `find /sys/devices -name net | grep -v virtual`; do ls $DEV/; done
eth1
eth0
[hoge@fuga ~]$

以上


  1. 同一構成のハードウェアに同一ディストリビューションを入れる場合や、RaspberryPI など、構成が固定されている組み込み系ハードの場合は予測可能