如何在 UNIX 中检测 NIC 是否处于启动状态?

如何在 UNIX 中检测 NIC 是否处于启动状态?

我目前正在编写一个 bash 脚本(用于 Nagios),我希望能够检测特定网卡是否启动。

我最好的猜测是做这样的事情:

ifconfig eth0 | grep UP | wc -l

或者:

 ethtool eth0 | grep "Link detected: yes" | wc -l

这两种方法是否都可以可靠地测试网卡是否正常运行,或者是否有更好的选择?也许有一个标志ethtool可以精确地执行我想要的操作?

答案1

我认为这也许是最好的方法。您可能希望对卡进行一些更具体的处理,例如您建议的 grep“检测到链接:是”。请确保转义冒号等特殊字符,以确保正确找到它。您还可以在其 IP 地址段上 grep,例如“192.168.25”。用于 C 类内部 IP 地址。这将基于您的内部网络,无论它是什么。但我认为这绝对是最好的方法。

可能还存在一些方法可以实际检测变化并触发某些事件。

答案2

检查接口是否启动:

ip link show eth0 | grep -qs "[<,]UP[,>]"

检查是否已分配任何 IPv4 地址:

ip -4 addr show eth0 | grep -Eqs "^\s"

一般来说,如果您想要匹配计数,grep | wc -l应该替换为。grep -c

或者grep -qs如果您只想要基于退出代码的“匹配/不匹配”:if stuff | grep -qs stuff; then ... fi

答案3

showiproute-3.14.0-2 中的命令有此选项:

向上- 仅显示正在运行的接口。

因此,如果您运行ip link show eth0 up并且接口已关闭,则输出将为空。

要检查,请参阅问题“在 Bash 中测试命令是否返回字符串或不返回任何内容”来自 Stack Overflow。基本上,像这样的东西应该可以解决问题:

test -n "`ip link show eth0 up`"

如果 eth0 已启动,它将以状态 0 退出。

答案4

我认为link detected…这还不够。您还应该 grep,inet addr因为即使可以从交换机检测到链接,NIC 也可能没有有效的 IP 地址。

相关内容