私のコンピュータのネットワークカード(またはインターフェイス)名と対応する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
コマンドを使用できますが、ip
IPアドレスとインターフェイス名が同じ行に表示されないため、出力を解析するのは少し難しいので、インターフェイス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"
最初に出てくるので(以前のソートのため)生き残ります。