背景:
我正在使用 ifconfig 命令檢查 Linux 上的可用介面清單。
但是,ubuntu 16.04 和 ubuntu 17.10 中 ifconfig 的輸出格式有所不同。
進一步檢查,ubuntu17.10中的net-tools軟體包已升級(從net-tools 1.60到net-tools 2.10-alpha),最新的ifconfig輸出帶有冒號(':')的網路介面名稱。在舊版本上:
$ ifconfig --version net-tools 1.60 ifconfig 1.42 (2001-04-13)
$ ifconfig
enp0s3 連結 encap:以太網
在較新的版本上
$ ifconfig --版本 net-tools 2.10-alpha
$ifconfig
ens160:標誌=4163 mtu 1500
瞧:標誌=73 mtu 65536
這可能會破壞一些確實考慮或期望輸出中額外的“:”的工具。
問題:
有沒有辦法以可靠的方式獲取網路介面列表,以便 ifconfig 輸出格式的任何更改都不會影響使用它的工具?是否有可以以一致的方式使用 ifconfig 的替代方案?
答案1
這網路工具包裹是已棄用一段時間以來,被 iproute2 取代(ip
是該軟體包中的主要工具)。許多發行版甚至不再將網路工具作為其基本安裝的一部分。
網路工具的開發此後已重新啟動,但這導致許多工具以破壞相容性的方式得到增強,正如您在ifconfig
.在NEWS.Debian.gz
Debian 9.0 系統上:
在 15 年沒有進行上游開發之後,net-tools 正在再次開發,解決了許多長期存在的問題。壞消息是許多命令的輸出已經改變,並且肯定會破壞依賴解析它的腳本。
因此,調整腳本以使用 iproute2 工具可能是一個好主意。例如,ip link
應該為您提供與上面類似的資訊ifconfig
。這種方法的一個缺點是它破壞了與非 Linux 系統的兼容性,幾乎所有非 Linux 系統都使用ifconfig
.
答案2
從 shell 列出 Linux 中所有介面的另一種方法是讀取/proc/net/dev
,它的格式比來自 的 ifconfig(8) 的輸出更穩定net-tools
。
例如,要取得介面名稱:
whr@debianjessie:~$ sed -r -e 1,2d -e 's/^ +//' -e 's/: .+//' /proc/net/dev
ppp0
lo
eth0
eth1