我目前正在编写一个 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
show
iproute-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 地址。