最近,我讨论了一个 Linux 盒子,它的一个接口缺少网络脚本。现在我也有类似的情况。不知何故,eth1
在没有 IP 地址的 CentOS 机器上安装了一个接口。它显示ifconfig eth1
如下:
# ifconfig eth1
eth1: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether 00:50:56:a9:cd:2e txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我可以通过迭代接口以编程方式修复此问题。我更喜欢用于ip -o
脚本编写目的,因为 -o 标志表示将所有内容放在一行上。遗憾的是,ip -o
即使我专门询问非寻址接口,也会跳过任何没有 IP 的接口:
# ip -o addr show dev eth1
# ip addr show dev eth1
4: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 00:50:56:a9:cd:2e brd ff:ff:ff:ff:ff:ff
# ip -o addr show dev eth0
[snip reasonable output]
# echo $?
0
# ip -o addr show dev eth1
# echo $?
0
你最好如何解决这个问题?我可以使用 Perl 模块,但我更喜欢使用通用 shell 命令。
答案1
所以也许你有一个定制工具这给出了非零退出代码当没有找到地址时:
[root@localhost]~# ./localaddr -4 enp0s8
[root@localhost]~# echo $?
2
[root@localhost]~# ./localaddr -4 enp0s3
192.168.9.10
[root@localhost]~# echo $?
0
但这与使用 Perl 模块非常相似,它可能使用类似的接口来获取商品。
您还可以要求ip
人们返回一个非零退出代码,也许是在设置标志时,如果没有地址的话。
否则,您可能需要进行涉及更多命令的更昂贵的计算:
[root@localhost]~# ip -json
Option "-json" is unknown, try "ip -help".
... Centos 7 上没有这个功能,因此移植到较旧的 Linux 可能会有问题。与此同时,在一个不太有历史的 Linux 系统上,
[root@localhost]~# ip -4 -json addr show dev enp0s3 | jq -e '.[].addr_info[].local' ; echo $?
"192.168.9.11"
0
[root@localhost]~# ip -4 -json addr show dev enp0s8 | jq -e '.[].addr_info[].local' ; echo $?
4
...但是启动 shell 管道而不是运行单个程序对我来说似乎效率较低,所以我可能不会使用它。
答案2
你的问题
回答你很困难,因为你的问题是:
你最好如何解决这个问题?
“这个”是:
ip -o
跳过任何没有 IP 的接口
但我不知道你到底想要实现什么,所以我的答案可能会也可能不会满足你的目的。
我的答案
反正,如果您想列出每个接口,无论它们是否有 IP 地址,请ip link
使用ip addr
:
ip -o link show # will list all interfaces
ip -o link show dev eth1 # will show eth1
这将为您提供 MAC 地址、启动/关闭状态和一些其他信息。
为什么它不起作用
该-o
标志每行显示一个结果。如果您要求查看地址,它将迭代地址列表并向您显示每行一个地址,或无如果没有要迭代的地址。