Em um ambiente Linux, preciso detectar o estado físico conectado ou desconectado de um conector RJ45 em seu soquete. De preferência, usando apenas scripts BASH.
As seguintes soluções propostas em outros sites NÃO funcionam para esse fim:
- Usando 'ifconfig' - já que um cabo de rede pode estar conectado, mas a rede não está configurada corretamente ou não está ativa no momento.
- Faça ping em um host - pois o produto estará em uma LAN usando uma configuração de rede desconhecida e hosts desconhecidos.
Não existe algum estado que possa ser usado no sistema de arquivos / proc (tudo o resto está lá)?
Como o mundo do Linux deve ter sua própria versão do balão do Windows que aparece na bandeja de ícones, indicando que você acabou de desconectar o cabo de rede?
Kent Fredric e lothar , suas duas respostas satisfazem minha necessidade ... muito obrigado! Qual deles eu vou usar ... ainda não sei.
Eu acho que não posso colocar vocês dois como a resposta correta? E provavelmente é justo para você que eu escolha um. Jogue uma moeda, eu acho? Mais uma vez, obrigado!
fonte
grep -H . eth0/*
Esse chicote de linhas vazias e o nome da entrada impressa pertencem a cada linha.grep -s "" eth0/*
Você pode usar o ethtool :
Para obter apenas o status do Link, você pode usar o grep:
fonte
grep Link
faz isso. Obrigado!!up
declarar.Use 'ip monitor' para obter alterações no estado do link em TEMPO REAL.
fonte
1
quando o meu cabo está desconectado enquantoip monitor
na verdade mostra algocat /sys/class/net/ethX
é de longe o método mais fácil.A interface precisa estar ativa, caso contrário, você receberá um erro de argumento inválido.
Então primeiro:
Então:
fonte
ethX/carrier
que é 1 se for detectado o 'transportador', o que significa que um cabo é conectado e carregando dados ...No nível baixo, esses eventos podem ser capturados usando soquetes rtnetlink , sem nenhuma pesquisa. Nota lateral: se você usar o rtnetlink, precisará trabalhar em conjunto com o udev ou seu programa poderá ficar confuso quando o udev renomear uma nova interface de rede.
O problema em fazer configurações de rede com scripts de shell é que os scripts de shell são terríveis para o tratamento de eventos (como um cabo de rede sendo conectado e retirado). Se você precisar de algo mais poderoso, dê uma olhada na minha linguagem de programação NCD , uma linguagem de programação projetada para configurações de rede.
Por exemplo, um script NCD simples que imprime "cable in" e "cable out" em stdout (assumindo que a interface já esteja ativa):
(internamente,
net.backend.waitlink()
usa rtnetlink enet.backend.waitdevice()
usa udev)A idéia do NCD é que você o utilize exclusivamente para configurar a rede; portanto, normalmente, os comandos de configuração são intermediários, como:
A parte importante a ser observada é que a execução pode regredir ; no segundo exemplo, por exemplo, se o cabo for puxado, o endereço IP será removido automaticamente.
fonte
Existem dois daemons que detectam esses eventos:
ifplugd e netplugd
fonte
ifplugstatus
ferramenta doifplugd
daemon. Não há necessidade de argumentos, basta digitarifplugstatus
e você receberá toda a NIC como conectada ou desconectada.As distribuições Linux mais modernas usam o NetworkManager para isso. Você pode usar o D-BUS para ouvir os eventos.
Se você deseja que uma ferramenta de linha de comando verifique o status, também pode usar
mii-tool
, desde que tenha em mente a Ethernet.fonte
mii-tool
parece ser o único comando que pode relatar o status do link quando a interface está inoperante.Eu uso este comando para verificar se um fio está conectado:
Se o resultado for alto ou baixo. Às vezes, mostra desconhecido, então você precisa verificar
Mostra 0 ou 1
fonte
Algumas precisões e truques
Eu faço tudo isso como usuário normal (não root )
Obter informações de
dmesg
Usar
dmesg
é uma das primeiras coisas a fazer para consultar o estado atual do sistema:poderia responder algo como:
ou
dependendo do estado, a mensagem pode variar dependendo do hardware e dos drivers usados.
Nota: isso poderia ser escrito,
dmesg|grep eth.*Link.is|tail -n1
mas eu prefiro usarsed
.Teste em torno de
/sys
pseudo sistema de arquivosLer ou escrever abaixo
/sys
pode danificar seu sistema, especialmente se for executado como root ! Voce foi avisado ;-)Este é um método de agrupamento, não um rastreamento de evento real .
Pode renderizar algo como (depois de desconectar e reconectar, dependendo):
(Pressione Enterpara sair do loop)
Nota: Isso requer
patch
a instalação.Em suma, já deve haver algo sobre isso ...
Dependendo Instalação Linux , você pode adicionar
if-up
eif-down
scripts para ser capaz de reagir a este tipo de eventos.No Debian (como o Ubuntu ), você pode armazenar seus scripts em
veja
man interfaces
para mais informações.fonte
e1000
e a noite pode ocorrer em outro momento936555.596870
, mas você sempre veráNIC Link is
.Você pode usar o ifconfig.
Se a entrada mostrar RUNNING, a interface está fisicamente conectada. Isso será mostrado independentemente de a interface estar configurada.
Esta é apenas outra maneira de obter as informações
/sys/class/net/eth0/operstate
.fonte
no arch linux. (não tenho certeza de outras distros), você pode visualizar o estado oposto. que aparece se conectado ou desativado, se não o operstate vive
fonte
ou para mim fica mais rápido:
Ele ouvirá o arquivo syslog.
Resultado (se desconectar e após 4 segundos conectar novamente):
fonte
De alguma forma, se você quiser verificar se o cabo ethernet conectou o linux após a recomendação: "ifconfig eth0 down". Eu encontro uma solução: use a ferramenta ethtool.
se o cabo estiver conectado, o teste de link será 0, caso contrário, será 1.
fonte
Eu estava usando meu dispositivo aprimorado OpenWRT como repetidor (que adiciona recursos de Ethernet virtual e LAN sem fio) e descobri que os valores da operadora / sys / class / net / eth0 e da operadora não eram confiáveis. Eu brinquei com o /sys/class/net/eth0.1 e /sys/class/net/eth0.2, bem como (pelo menos para a minha descoberta) nenhuma maneira confiável de detectar se algo estava fisicamente conectado e falando em qualquer das portas Ethernet. Eu descobri uma maneira um tanto grosseira, mas aparentemente confiável, de detectar se alguma coisa havia sido conectada desde o último estado de reinicialização / inicialização, pelo menos (que funcionou exatamente como eu precisava no meu caso).
Você receberá um 0 se nada estiver conectado e algo> 0 se alguma coisa estiver conectada (mesmo que tenha sido conectada e removida) desde o último ciclo de inicialização ou reinicialização.
Espero que isso ajude alguém, pelo menos!
fonte