network_iface_nameマッピングの生成<--> IPv4アドレス

network_iface_nameマッピングの生成<--> IPv4アドレス

私のコンピュータのネットワークカード(またはインターフェイス)名と対応するIPアドレス(可能な場合はCIDR形式)との間のマッピングを生成するbashスクリプトを実装したいと思います。

目標は、連想配列のようなもの、または次のようなファイルを持つことです。

lo: "127.0.0.1/8"
eth0: "192.168.1.123/24"
br-priv: ""      # <-- No IP assigned
wlan0: "10.42.0.10/24"

ifconfigコマンドを使用できますが、ipIPアドレスとインターフェイス名が同じ行に表示されないため、出力を解析するのは少し難しいので、インターフェイスIPアドレスを見つけてロールバックしてネットワーク名を見つける必要があります。あるいはその逆も。

私のインターフェイスのIPアドレスを見つける他の方法はありますか?

以下のすべてのインターフェイス名があります(ディレクトリ名で)。/sys/class/net/

root@borrajax:~# ls /sys/class/net/
br-priv/   eth0/    lo/    mon0/   wlan0/

ただし、このディレクトリにIPが見つかりません。ディレクトリを繰り返してディレクトリ名を検索し、他のファイルからIPを読み取ることができるので、これは非常に便利です。

これは組み込みシステムで実行するように設計されています。オープンWRTただし、Debianベースのシステム用のソリューションがより適している可能性があります。bashもし私のバージョンは4.2.28です。

ベストアンサー1

以下の「-o」オプションを使用してくださいip

ip  -o addr  | sed -e 's/^[0-9]: \([^ ]*\).*inet \([^ \t]*\).*/\1: "\2"/;t;s/^[0-9]*: \([^ :]*\).*/\1: ""/g' | sort -r | sort -u -t: -k1,1

あなたの場合、出力は次のようになります。

br-priv: "" 
eth0: "192.168.1.123/24"
lo: "127.0.0.1/8"
wlan0: "10.42.0.10/24"

このコマンドは、ネットワークデバイスごとに1つのIPv4のみを印刷します(同じインターフェイスで複数のIPアドレスを設定できます)。


説明する:

表現sed方式

s/^[0-9]: \([^ ]*\).*inet \([^ \t]*\).*/\1: "\2"/;

1: lo inet 127.0.0.1/8 brd 255 [...]次へ交換lo: "127.0.0.1/8"

t;

可能であれば最後に移動します(= IPv4アドレスが見つかりました)。それ以外の場合:

s/^[0-9]*: \([^ :]*\).*/\1: ""/

IPv4アドレスがない行1: lo inet6 ::1/128 [...]lo: ""

すべての行が自動的に印刷されます(-nフラグなし)。

このコマンドはsort -r行を逆順に並べ替えます。すべての場合に、IPv4アドレス(たとえば)を含む行は、lo: "127.0.0.1/8"()のない行lo: ""の前にあります。

このコマンドは、sort -u -t: -k1,1最初のフィールド(インターフェース名、区切り文字がに設定されている:)に一意のソートを適用します。この例では、「行だけがlo: "127.0.0.1/8"最初に出てくるので(以前のソートのため)生き残ります。

おすすめ記事