проверьте, работает ли интерфейс eth0 (настроен)

30

Мне нужно проверить скриптом, eth0настроен ли . Если это так, скрипт ничего не сделает. В противном случае это начнется wlan0. (Я не хочу и то eth0и другое wlan0одновременно).

Какой был бы самый простой способ проверить, eth0уже есть ли ?

Я использую Debian Wheezy

ПОЯСНЕНИЯ:

Я хотел бы проверить не только то, что кабель eth0подключен, но и то, что интерфейс настроен (т. Е. У него либо установлен статический IP-адрес, либо он получил IP-адрес DHCP). Если кабель подключен, но eth0не настроен правильно, я хочу запуститьwlan0

user1968963
источник
2
Я не уверен в том, что я собираюсь сказать, но cat /sys/class/net/ | grep eth0должен дать вам легко анализируемые данные. Вы также можете сделатьsudo ethtool eth0 | grep Link
Kiwy

Ответы:

45

Вы можете сделать это многими способами. Вот пример:

$ cat /sys/class/net/eth0/operstate
up
cuonglm
источник
5
К сожалению, это не гарантирует, что интерфейс полностью настроен. Можно /sys/class/net/eth0/carrierпроверить кошку на наличие сигнала, но он все еще может не иметь аренды DHCP и т. Д.
orodbhen
7
ip a show ethX up

Если ничего не отображается, значит, ваш интерфейс не работает

Максимум
источник
Этот метод: «ip a show ethX up» и проверка выходных данных недостаточен
Джошуа Клэйтон
5
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}'

Вышеуказанный IP-адрес CIDR будет распечатан только в том случае, если ваша цель $if- UP, подключена и имеет такой адрес . Для ipv6 решение такое же простое с незначительными изменениями.

Если вам не нравится, sedвы могли бы достичь аналогичных результатов с другим |pipe ... grepи добавив -Aконтекстную опцию к первому grep- но мне нравится sed.

mikeserv
источник
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.
Лекенштейн
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
xinthose
источник
В ip routeDebian Stretch нет «ссылки», с которой нужно работать .
Инго