澄清:

澄清:

我需要检查脚本是否eth0已配置。如果是这样,脚本将不会执行任何操作。否则就会开始wlan0。 (我不想两者eth0同时wlan0起床)。

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

我正在使用 Debian Wheezy

澄清:

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

答案1

您可以通过多种方式做到这一点。这里有一个例子:

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

答案2

ip a show ethX up

如果没有显示任何内容,则说明您的界面已关闭

答案3

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

所以在这里我们grep无处不在的ip工具stdout对于包含我们感兴趣的界面和短语的行“状态向上”(感谢@Lekensteyn 指出需要更多的特异性,而不仅仅是UP)。我们使用参数a作为缩写形式address这应该足以获得系统中所有配置的网卡的列表。

使用的一大好处ip可能它确实应该随处可用 - 例如,这是我通常配置 Android 手机网络设备的方式。

:colons用于避免部分匹配 - 通过这种方式我们保证匹配eth0与其他可能的情况相反someothereth0或者eth007

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

编辑:

为了满足当前的要求,您可以:

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

如果您的目标是,以上内容只会打印 CIDR IP 地址$if向上,已插入,并且有一个。对于 ipv6,解决方案同样简单,只需进行少量修改。

如果你不喜欢sed你可以用另一个获得类似的结果|pipe ... grep并添加一个-A第一个上下文选项grep- 但我喜欢sed

答案4

其他方法不起作用,但这个方法可以(至少在 Ubuntu 上):

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

相关内容