Como verificar em uma linha de comando se a rede está acessível?

Como verificar em uma linha de comando se a rede está acessível?

Quero enviar um rosnado para mim mesmo depois que o servidor SuSE terminar o processo de inicialização. Recebi esta mensagem socket_sendto(): unable to write to socket [101]: Network is unreachable in.

Como posso verificar na linha de comando se a rede está acessível e esperar caso não esteja?


Responder1

pingpara um host externo pode falhar por uma série de razões, apenas algumas das quais realmente dizem algo útil sobre o estado da sua própria rede.

Como primeira etapa, abra uma janela de terminal e digite ip route ls

Você deverá ver uma saída nos moldes de

shadur@equinox:~$ ip route ls
192.168.15.0/24 dev eth0  proto kernel  scope link  src 192.168.15.102 
default via 192.168.15.1 dev eth0 

Isso indica que sua rede local é uma conexão ethernet ( eth0) com o endereço 192.168.15.0, e que seu gateway padrão através do qual acessa o resto da internet pode ser encontrado em 192.168.15.1.

Em seguida, você pode tentar pingesse endereço:

shadur@equinox:~$ ping 192.168.15.1
PING 192.168.15.1 (192.168.15.1) 56(84) bytes of data.
64 bytes from 192.168.15.1: icmp_req=1 ttl=255 time=0.352 ms
64 bytes from 192.168.15.1: icmp_req=2 ttl=255 time=0.269 ms
^C
--- 192.168.15.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.269/0.310/0.352/0.045 ms

Se você vir algo semelhante ao acima, sua própria rede local está, pelo menos, bem. Neste ponto, você pode começar a procurar ferramentas mais avançadas, como traceroutever onde sua conexão com o destino pode estar falhando.

No entanto, depois de uma rápida verificação no Google do que growlrealmente deveria ser, tenho a sensação de que há algo mais errado. Você pode expandir sua pergunta para nos fornecer mais alguns detalhes sobre o que você está tentando fazer, como está tentando e a saída completa do erro? A linha que você está nos fornecendo foi cortada abruptamente...

Responder2

Uma maneira muito simples e rápida é usar o pingcomando.

Você pode simplesmente digitar

 $ ping yahoo.com

(ou cnn.com ou qualquer outro host) e veja se você obtém alguma saída. Isso pressupõe que os nomes de host podem ser resolvidos (ou seja, o DNS está funcionando). Caso contrário, você poderá fornecer um endereço/número IP válido de um sistema remoto e ver se ele pode ser alcançado.

Aqui está opágina de manual do ping.

Atualizar:

Como um exemplo rápido, você pode verificar ovalor de retorno(por exemplo, com "echo $?") from pingpara ver se o comando foi bem-sucedido (você sempre pode canalizar a saída do comando para > /dev/nul). Observe que eu uso -c 1aqui, mas você poderia usar mais.

$ ping -c 1 yahoo.com
PING yahoo.com (72.30.38.140) 56(84) bytes of data.
64 bytes from ir1.fp.vip.sp2.yahoo.com (72.30.38.140): icmp_seq=1 ttl=52 time=83.5 ms

--- yahoo.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 83.593/83.593/83.593/0.000 ms

echo $?
0


$ ping -c 1 unicorns.are.here
ping: unknown host unicorns.are.here

$ echo $?
2

Responder3

Eu usaria netcatpara o serviço desejado.

Por exemplo, testando uma porta IP, sucedendo

> nc -zv 192.168.1.1 80
Connection to 172.26.0.1 80 port [tcp/http] succeeded!

...e falhando

> nc -zv 192.168.1.1 22
netcat: connect to 172.26.0.1 port 22 (tcp) failed: Connection refused

com tempo limite de 10s

> nc -zv -w 10 10.0.0.1 80
netcat: connect to 10.0.0.1 port 80 (tcp) timed out: Operation now in progress

Responder4

Eu uso a seguinte função... O padrão é quad9 mas você pode passar um domínio diferente. O tempo limite expirará após 15 minutos de tentativa

wait_for_dns() {

   local fqhn="quad9.net"
   fqhn=${1:-$fqhn}

   printf "waiting"
   for i in {1..15}; do
      local a_record=$(dig +short +time=2 $fqhn)

      if [[ $a_record != '' ]]; then
         printf "\n"
         return 0
      fi

      printf '.'
      sleep 60
   done

   printf "\n"
   return 1
}

informação relacionada