检查接口eth0是否已启动(已配置)


30

我需要检查一个脚本,是否eth0已配置。如果是这样,脚本将不执行任何操作。否则它将开始wlan0。(我不希望同时eth0wlan0在同一时间待涨)。

什么是最简单的检查方法,是否eth0已经启动?

我正在使用Debian Wheezy

澄清:

我不仅要检查电缆eth0是否已插入,还要检查接口是否已配置(即,它是否设置了静态IP或已接收到DHCP IP)。如果电缆已插入,但eth0配置不正确,我要启动wlan0


2
我不确定我要说什么,但cat /sys/class/net/ | grep eth0应该为您提供容易分析的数据。您也可以这样做sudo ethtool eth0 | grep Link
Kiwy 2014年

Answers:


45

您可以通过多种方式进行操作。这里是一个例子:

$ cat /sys/class/net/eth0/operstate
up

5
不幸的是,这不能保证接口已完全配置。您可以猫/sys/class/net/eth0/carrier,检查的信号,但它仍然可能没有DHCP租约尚未等
orodbhen

7
ip a show ethX up

如果未显示任何内容,则您的界面已关闭


这种方法:“ ip a show ethX up”并检查输出是不够的
Joshua Clayton '18

5
ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing 

因此,在这里,我们使用grep了一种普遍使用的ip工具stdout,该工具既包含我们感兴趣的界面,又包含短语“ state UP”(感谢@Lekensteyn指出了比不仅仅是更多的特异性UP)。我们使用该参数a作为的简写形式address,这应该足以获取系统中所有已配置网卡的列表。

使用ip它的一个优势可能是它确实应该在任何地方都可以使用-例如,这就是我通常配置Android手机的网络设备的方式。

:colons用于避免部分匹配-这样我们保证了比赛eth0,而不是否则可能someothereth0eth007

感谢@RaphaelAhrens为我推动正确性并解释我的解决方案。

编辑:

要处理当前需求,您可以:

ip a | sed -rn '/: '"$if"':.*state UP/{N;N;s/.*inet (\S*).*/\1/p}'

如果您的目标$ifUP,已插入并且有一个目标,则以上仅显示CIDR ip地址。对于ipv6,只需稍作修改即可解决。

如果您不喜欢sed,可以通过与其他方法取得类似的结果,|pipe ... grep-A在第一个方法中添加上下文选项grep-但我喜欢sed


1
您应该解释自己在做什么。这样每个人都可以从您的答案中受益。
拉斐尔·阿伦斯

5
这还不够。UP如果设备已启动,但没有连接电缆,则输出还包含:2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000。您还可以指定设备以避免误报:ip addr show dev eth0
Lekensteyn 2014年

0

其他方法无效,但这种方法有效(至少在Ubuntu上):

while true; do
    ip route | grep "linkdown"
    if [ $? -eq 0 ]; then
        sleep 1  # network not yet up
    else
        break   # network up
    fi
done

ip route在Debian Stretch上没有grep的“ linkdown” 。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.