創建映射 network_iface_name <–> IPv4 地址
我想實現一個 bash 腳本,它在我的電腦中的網卡(或介面)名稱與其 IP 地址(如果可能的話,以 CIDR 格式)之間創建映射。
目標是擁有一個關聯數組,或者一個看起來像這樣的文件:
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。
這旨在在執行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"
行首先出現(由於之前的排序)。