verifique se a interface eth0 está ativa (configurada)

30

Eu preciso verificar com um script, se eth0está configurado. Nesse caso, o script não fará nada. Caso contrário, ele começará wlan0. (Eu não quero os dois eth0e wlan0estar acordado ao mesmo tempo).

Qual seria a maneira mais fácil de verificar, se eth0 já está ativo?

Estou usando o Debian Wheezy

ESCLARECIMENTO:

Gostaria de verificar não apenas se o cabo eth0está conectado, mas também se a interface está configurada (ou seja, tem um conjunto de IP estático ou recebeu um IP de DHCP). Se o cabo estiver conectado, mas eth0não estiver configurado corretamente, quero iniciarwlan0

user1968963
fonte
2
Não tenho certeza do que vou dizer, mas cat /sys/class/net/ | grep eth0devo fornecer dados facilmente analisáveis. Você também pode fazersudo ethtool eth0 | grep Link
kiwy

Respostas:

45

Você pode fazer isso de várias maneiras. Aqui está um exemplo:

$ cat /sys/class/net/eth0/operstate
up
cuonglm
fonte
5
Infelizmente, isso não garante que a interface esteja totalmente configurada. Pode gato /sys/class/net/eth0/carrier, para verificar se há um sinal, mas ainda não pode ter uma concessão de DHCP, no entanto, etc.
orodbhen
7
ip a show ethX up

Se nada for exibido, sua interface estará inativa

max
fonte
Este método: "ip um show ethX up" e verificar se há saída, não é suficiente
Joshua Clayton
5
ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing 

Então aqui nós grepa ipferramenta onipresentestdout uma linha que contém a nossa interface de interesse e a frase "state UP" (obrigado a @Lekensteyn por apontar a necessidade de um pouco mais de especificidade do que apenas UP). Usamos o argumento acomo o formato abreviado addresse isso deve ser suficiente para obter uma lista de todas as placas de rede configuradas no sistema.

Uma vantagem do uso ippode ser que ele realmente deve estar disponível em qualquer lugar - é como eu geralmente configuro os dispositivos de rede do meu telefone Android, por exemplo.

o :colons são usados ​​para evitar correspondências parciais - dessa forma, garantimos uma correspondência para eth0, ao contrário de um someothereth0ou de outra forma possível eth007.

Obrigado @RaphaelAhrens por me sugerir a correção e explicar minha solução.

EDITAR:

Para lidar com os requisitos atuais, você pode:

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

O texto acima apenas imprimirá um endereço IP do CIDR se o seu destino $if estiver em UP, conectado e tiver um. Para o ipv6, a solução é tão simples com apenas pequenas modificações.

Se você não gostar, sedpoderá obter resultados semelhantes com outro |pipe ... grepe adicionar uma -Aopção de contexto à primeira grep- mas eu gosto sed.

mikeserv
fonte
11
Você deve explicar o que está fazendo. Para que todos possam se beneficiar da sua resposta.
Raphael Ahrens 26/03
5
Isso é insuficiente. A saída também contém UP, se o dispositivo é para cima, mas não é ligado por cabo: 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000. Você também pode especificar o dispositivo para evitar falsos positivos: ip addr show dev eth0.
Lekensteyn
0

Os outros métodos não funcionam, mas este funciona (pelo menos no 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
fonte
Não há "linkdown" para o grep ip routeno Debian Stretch.
Ingo