TR; DR: use nmcli dev status
para obter uma lista de quais interfaces estão conectadas à rede e use ping google.com -c 4 -I ifacex
(onde ifacex é o nome real da interface com o número) para testar se eles estão realmente conectados. Para reconectar as interfaces sem fio nmcli nm wifi off; sleep 1; nmcli nm wifi on
e permitir a reconexão automática.
A maneira mais simples de fazer isso é através de nmcli dev status
. Este comando gera a lista de interfaces disponíveis em seu sistema e informa se elas estão conectadas ou não. Exemplo de saída do meu sistema
DEVICE TYPE STATE
eth0 802-3-ethernet unavailable
wlan0 802-11-wireless connected
Se quiser listar apenas os dispositivos que o estado está conectado, faça
%código%. Aqui, combinamos apenas as linhas que têm 'connected' string e imprimem seu nome. No meu caso, daria apenas nmcli dev status | awk '/connected/ {print $1}'
. Se você tivesse eth0 e wlan0 conectados, a saída da amostra seria
wlan0
eth0
Agora, no meu gerenciador de rede do sistema é meio buggy. Pode relatar o dispositivo como conectado, mas na realidade ele é desconectado.
Você pode testar a interface wlan0 com wlan0
. Isso envia 4 pacotes para ping google.com -c 4 -I wlan0
da interface wlan0. Agora eu também poderia fazer
google.com
, que irá obter o nome da minha interface wlan0 e colocar no final do comando ping como -I argumento. Exemplo de saída
PING google.com (216.58.217.46) from 192.168.0.68 wlan0: 56(84) bytes of data.
64 bytes from den03s10-in-f14.1e100.net (216.58.217.46): icmp_seq=1 ttl=57 time=44.0 ms
64 bytes from den03s10-in-f14.1e100.net (216.58.217.46): icmp_seq=2 ttl=57 time=40.0 ms
64 bytes from den03s10-in-f14.1e100.net (216.58.217.46): icmp_seq=3 ttl=57 time=48.0 ms
64 bytes from den03s10-in-f14.1e100.net (216.58.217.46): icmp_seq=4 ttl=57 time=40.0 ms
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3016ms
rtt min/avg/max/mdev = 40.000/43.000/48.000/3.316 ms
Muitas vezes, os utilizadores podem ter problemas de DNS, o que significa que a sua máquina não consegue traduzir o google.com para o endereço IP real (os computadores lidam apenas com endereços IP, como telefones que apenas lidam com números de telefone). Nesse caso, é melhor você executar nmcli dev status | awk '/connected/ {print $1}' | xargs ping google.com -c 4 -I
, onde ele testará se sua máquina tem conexão com a Web E resolve os nomes de domínio.
Agora, e se você tiver mais de uma interface conectada? Pessoalmente eu testaria cada interface com ping separadamente, sem depender desse one-liner, mas como estou me divertindo muito com o script recentemente, aqui está outro one-liner:
ping 8.8.8.8 -c 4 -I wlan0 && ping google.com -c 4 -I wlan0
Este, basicamente, encontra nomes de interfaces conectadas e executa o comando ping com cada uma delas. Como eu não tenho vários dispositivos conectados, vou mostrar como fica quando o awk obtém cada item da primeira coluna, então note que a primeira saída será errada, a segunda será eth0 e a terceira será wlan0
nmcli dev status | awk '/connected/ {print $1}' | xargs -n 1 ping google.com -c 4 -I
ping: SO_BINDTODEVICE: Invalid argument
ping: Warning: source address might be selected on device other than eth0.
PING google.com (216.58.217.46) from 192.168.0.68 eth0: 56(84) bytes of data.
From sergiy-Satellite-L455D.local (192.168.0.68) icmp_seq=1 Destination Host Unreachable
From sergiy-Satellite-L455D.local (192.168.0.68) icmp_seq=2 Destination Host Unreachable
From sergiy-Satellite-L455D.local (192.168.0.68) icmp_seq=3 Destination Host Unreachable
From sergiy-Satellite-L455D.local (192.168.0.68) icmp_seq=4 Destination Host Unreachable
--- google.com ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3152ms
pipe 3
PING google.com (216.58.217.46) from 192.168.0.68 wlan0: 56(84) bytes of data.
64 bytes from den03s10-in-f14.1e100.net (216.58.217.46): icmp_seq=1 ttl=57 time=44.0 ms
64 bytes from den03s10-in-f14.1e100.net (216.58.217.46): icmp_seq=2 ttl=57 time=48.0 ms
64 bytes from den03s10-in-f14.1e100.net (216.58.217.46): icmp_seq=3 ttl=57 time=40.0 ms
64 bytes from den03s10-in-f14.1e100.net (216.58.217.46): icmp_seq=4 ttl=57 time=40.0 ms
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3016ms
rtt min/avg/max/mdev = 40.000/43.000/48.000/3.316 ms
E como deveria, vemos que a eth0 está desconectada, wlan0 está conectada.
Outra coisa que você pode usar é nmcli dev status | awk '{print $1}' | xargs -n 1 ping google.com -c 4 -I
. Esse cara te dá um longo relatório sobre cada uma das suas interfaces, com configurações. Poderíamos reduzir isso apenas para a lista de interfaces e seus status com nm-tool
. Aqui nós substituímos o caractere chato por espaço, e pegamos o texto das strings Device to State.
Device: eth0
Type: Wired
Driver: r8169
State: unavailable
Device: wlan0
Type: 802.11
Driver: r8180
State: connected
O que mais?
nm-tool | tr '-' ' ' | awk '/Device/,/State/ {print $1,$2}'
, whois
e nslookup
são utilitários de pesquisa para nomes de domínio e endereços IP. Se você puder usá-los para descobrir informações sobre um domínio ou endereço IP, você está conectado. Eles não vão te dizer a interface, mas sim testar a conectividade.
Em conclusão : há mais de uma maneira de esfolar um gato, como você sabe. O primeiro comando dig
e nmcli dev status
é tudo o que você realmente precisa para testar suas conexões, e o ping é o "verdadeiro MVP" em qualquer sistema, por assim dizer. Agora, se você quiser ficar chique, aprenda alguns truques de linha de comando, por todos os meios, estude os one-liners que eu postei aqui! O poder do Ubuntu e Linux em geral está na linha de comando
Additions :
Outros notaram que reiniciar o gerenciador de rede com ping
fará o trabalho na maioria das vezes. Por padrão, todas as conexões são configuradas para serem autoconectadas quando o gerenciador de rede estiver no intervalo. Eu uso muito esse método!
O que mais pode ser feito? %código%. Isso desligará o Wi-Fi, fará uma pausa por um segundo e ligará novamente o Wi-Fi; e sua rede deve se reconectar automaticamente.