Проверьте, подключен ли сетевой кабель, не открывая интерфейс

9

Я пытаюсь определить сетевые карты на ~ 20 удаленных серверах (2-6 сетевых карт на каждом сервере). Для начала хочу выделить готовых к использованию и бесплатных. Как я могу проверить состояние физического носителя? Я знаю несколько способов, в том числе ifconfig|grep RUNNING, ethtool, cat /sys/class/net/eth0/carrier, но все они требуют , чтобы интерфейс вверх. Я не хочу поднимать ВСЕ интерфейсы. Не знаю почему, но мне не нравится включать, но не настраивать интерфейсы в сети. Есть ли способ, которым я могу избежать этого?

Или я просто не прав, и нет ничего плохого в том, что все интерфейсы работают (и не настроены)? Даже если они подключены?

Минаев
источник

Ответы:

5

ip link showпо умолчанию показывает все интерфейсы, используйте ip link show upдля отображения только работающих интерфейсов. Вы можете использовать фильтры, чтобы получить разницу.

Никхил Мулли
источник
Ага. И недостающий кабель будет отображаться как НЕТ НОСИТЕЛЬ, верно?
Минаев
Бинго. Спасибо. И ip addr showдаже добавляет IP-адреса на выходе.
Минаев
2
Это не работает на моей машине (Debian squeeze, skge driver): ip link showпоказывает только «ВНИЗ». ipсообщает ту же информацию, что ifconfigи /sys/class/net/в любом случае, не так ли? Получаете ли вы информацию о статусе ссылки, ipкоторая отличается от той, на которой вы находитесь /sys/class/netили ifconfigна вашей машине? Или вы получаете статус ссылки об интерфейсах, которые отключены /sys/class/net(я понимаю /sys/class/net/eth0/carrier: Invalid argument)?
Жиль "ТАК - перестань быть злым"
это не работает, если интерфейс не работает.
Владимир Кунщиков
@Nikhil Mulley Что вы подразумеваете под фильтрами?
Джо
2

Вот мой скрипт для обновления маршрутов по умолчанию в зависимости от состояния соединения в реальном времени . (работает в фоновом режиме) работает с несколькими интерфейсами, я определяю приоритеты в /tmp/${iface}.metricфайлах, «лучший» подключенный интерфейс будет использоваться для маршрутизации трафика по умолчанию.

#!/bin/sh

/sbin/ip monitor link | while read -r line
do
    iface=$(echo $line | sed -ne 's/[^ ]* \([^ ]*\): .* state \([^ ]*\).*/\1/p')
    state=$(echo $line | sed -ne 's/[^ ]* \([^ ]*\): .* state \([^ ]*\).*/\2/p')
    if [ "$iface" != "" ] ; then
        echo "$iface is $state"
        if [ -f /tmp/${iface}.metric ] ; then
                echo "updating default route for ${iface}"
                if [ "$state" = "DOWN" ] ; then
                        ip route del default dev "${iface}"
                else
                        ip route add default dev "${iface}" metric `cat /tmp/${iface}.metric`
                fi
        fi
    fi
done
user211708
источник
0

ip link show отображает флаг «LOWER_UP» для обозначения подключенного кабеля. Вы также можете проверить / sys / class / net / eth * / operstate или carrier. Однако все это работает только для интерфейса с привязанным к нему IP-адресом.

жюльен
источник
1
Интересная информация, но на самом деле не отвечает на оригинальный пост.
X Тянь
даже если у меня нет подключаемого модуля eth, он также скажет «вверх».
kangear