Bash

創建映射 network_iface_name <–> IPv4 地址

  • July 9, 2014

我想實現一個 bash 腳本,它在我的電腦中的網卡(或介面)名稱與其 IP 地址(如果可能的話,以 CIDR 格式)之間創建映射。

目標是擁有一個關聯數組,或者一個看起來像這樣的文件:

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

我有ifconfigip可用的命令,但是解析它們的輸出有點棘手,因為 IP 地址和介面的名稱沒有出現在同一行,所以我必須找到介面 IP 地址,然後回滾才能找到網路的名稱,反之亦然。

有沒有其他方法可以找到我的介面 IP 地址?

我有所有介面名稱(作為目錄名稱)/sys/class/net/

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

但我無法在這些目錄中找到他們的 IP。這樣做會很棒,因為我可以遍歷目錄,檢索目錄的名稱,然後從其他文件中讀取 IP。

這旨在在執行OpenWRT的嵌入式系統中執行,但基於 Debian 的系統的解決方案可能是合適的。我bash的版本是 4.2.28,以防萬一。

使用“-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"

該命令只為每個網路設備列印一個 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"行首先出現(由於之前的排序)。

引用自:https://unix.stackexchange.com/questions/141171