Verifique se o cabo de rede está conectado sem abrir a interface

9

Estou tentando identificar NICs em ~ 20 servidores remotos (2-6 NICs em todos os servidores). Para começar, quero identificar aqueles prontos para uso e gratuitos. Como posso verificar o estado da mídia física? Sei que algumas maneiras, incluindo ifconfig|grep RUNNING, ethtool, cat /sys/class/net/eth0/carrier, mas todos eles exigem que a interface é para cima. Não quero trazer TODAS as interfaces. Não sei por que, mas não gosto de ativar, mas não configurar interfaces na rede. Existe uma maneira de evitar isso?

Ou estou errado e não há nada ruim em todas as interfaces ativadas (e não configuradas)? Mesmo se eles estiverem conectados?

minaev
fonte

Respostas:

5

ip link show, por padrão, mostra todas as interfaces, use ip link show uppara mostrar apenas as interfaces em execução. Você pode usar filtros para obter a diferença.

Nikhil Mulley
fonte
Aha. E o cabo ausente aparecerá como NO-CARRIER, certo?
Minaev
Bingo. Obrigado. E ip addr showaté adiciona endereços IP à saída.
Minaev
2
Isso não funciona na minha máquina (squeeze Debian, driver do skge): ip link showmostra nada mais do que "DOWN". iprelata as mesmas informações ifconfige /sys/class/net/, em qualquer caso, não é? Você recebe informações de status link de ipque é diferente do que você ficar sob /sys/class/netou a partir ifconfigda sua máquina? Ou você obtém o status do link sobre interfaces que estão desativadas /sys/class/net(entendo /sys/class/net/eth0/carrier: Invalid argument)?
Gilles 'SO- stop be evil'
não funciona se a interface estiver inativa.
Vladimir Kunschikov 02/12/2015
@ Nikhil Mulley O que você quer dizer com filtros?
Joe
2

Aqui está o meu script para atualizar rotas padrão com base no estado da conexão em tempo real . (executado em segundo plano) funciona com várias interfaces, defino prioridades nos /tmp/${iface}.metricarquivos, a 'melhor' interface conectada será usada para rotear o tráfego padrão.

#!/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
fonte
0

ip link show exibe a bandeira "LOWER_UP" para indicar o cabo conectado. Você também pode procurar por / sys / class / net / eth * / operstate ou carrier. No entanto, tudo isso funciona apenas para uma interface com um endereço IP associado a ela.

julien
fonte
11
Informações interessantes, mas realmente não respondem à postagem original.
X Tian
mesmo que eu não tenha o plugin eth, ele também dirá "up".
kangear