背景:
我正在使用 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