Comando / script do shell para ver se um host está ativo?

9

Estou tentando descobrir mais maneiras de ver se um determinado host está ativo, usando apenas comandos do shell (principalmente o bash). Idealmente, ele seria capaz de trabalhar com nomes de host e endereços IP. No momento, a única maneira nativa que conheço é o ping, talvez integrado a um script, conforme descrito aqui. Alguma outra ideia?

user67459
fonte

Respostas:

7

ping é a maneira de testar se um host está ativo e conectado. (Se um host estiver ativo, mas desconectado ou com uma resposta lenta, não será possível diferenciá-lo de estar morto.)

As opções suportadas pelo pingcomando variam de sistema para sistema. Você deseja garantir que ele não fique em loop para sempre, mas retornará após alguns segundos se não receber uma resposta.

Com os iputils do FreeBSD e Linux, ping -c 1 -W 1 >/dev/nullenvia um único ping e aguarde 1 segundo. Você não precisa analisar a saída: o comando retornará 0 se recebeu um ping back e diferente de zero (nome do host desconhecido, nenhuma rota para o host, nenhuma resposta). Algumas implementações podem precisar de diferentes sinalizadores (por exemplo, em -wvez de -Wno FreeBSD), consulte o manual em seu sistema.

if ping -c 1 -W 1 "$hostname_or_ip_address"; then
  echo "$hostname_or_ip_address is alive"
else
  echo "$hostname_or_ip_address is pining for the fjords"
fi
Gilles 'SO- parar de ser mau'
fonte
Eu sei que é o caminho, eu só esperava que não fosse o único, mesmo que os outros caminhos sejam estranhos ou volúveis ou o que você tem. Ah bem!
user67459
2
Esta resposta NÃO deveria ter sido marcada como answeredresposta. O PO solicitou especificamente more ways to see if a given host is up, além de ping, que esta resposta não fornece.
Yokai 21/01
Na página do manual 'ping':"Because of the load it can impose on the network, it is unwise to use ping during normal operations or from automated scripts."
1111161171159459134
@ 1111161171159459134 Esse parágrafo poderia ter sido redigido melhor. É excessivamente alarmista. Você não deve fazer pings de inundação ou pings com uma taxa muito alta, mas um pacote de ping de vez em quando é insignificante.
Gilles 'SO- stop be evil'
2

O ping é ótimo para obter uma resposta rápida sobre se o host está conectado à rede, mas geralmente não informa se o host está ativo ou não ou se ainda está operando conforme o esperado. Isso ocorre porque as respostas de ping geralmente são tratadas pelo kernel; portanto, mesmo que todo aplicativo no sistema tenha travado (por exemplo, devido a uma falha no disco ou falta de memória), você ainda receberá respostas de ping e pode assumir que a máquina está funcionando. funcionando normalmente quando a situação é exatamente o oposto.

Serviços de verificação

Normalmente, você realmente não se importa se um host ainda está online ou não, o que realmente importa é se a máquina ainda está executando alguma tarefa. Portanto, se você puder verificar a tarefa diretamente, saberá que o host está ativo e que a tarefa ainda está em execução.

Para um host remoto que executa um servidor web, por exemplo, você pode fazer algo assim:

# Add the -f option to curl if server errors like HTTP 404 should fail too
if curl -I "http://$TARGET"; then
  echo "$TARGET alive and web site is up"
else
  echo "$TARGET offline or web server problem"
fi

Se ele executar o SSH e você tiver as chaves configuradas para o login sem senha, você terá mais algumas opções, por exemplo:

if ssh "$TARGET" true; then
  echo "$TARGET alive and accessible via SSH"
else
  echo "$TARGET offline or not accepting SSH logins"
fi

Isso funciona fazendo SSH no host e executando o truecomando e fechando a conexão. O sshcomando retornará sucesso apenas se esse comando puder ser executado com sucesso.

Testes remotos via SSH

Você pode estender isso para verificar processos específicos, como garantir a mysqldexecução da máquina:

if ssh "$TARGET" bash -c 'ps aux | grep -q mysqld'; then
  echo "$TARGET alive and running MySQL"
else
  echo "$TARGET offline or MySQL crashed"
fi

Obviamente, nesse caso, seria melhor executar algo como monitno destino para garantir que o serviço continue sendo executado, mas é útil em scripts nos quais você deseja executar apenas algumas tarefas na máquina A, desde que a máquina B esteja pronta para isso. .

Isso pode ser algo como verificar se a máquina de destino possui um determinado sistema de arquivos montado antes de executá rsync-lo, para que você não encha acidentalmente seu disco principal se um sistema de arquivos secundário não for montado por algum motivo. Por exemplo, isso garantirá que /mnt/raidesteja montado na máquina de destino antes de continuar.

if ssh "$TARGET" bash -c 'mount | grep -q /mnt/raid'; then
  echo "$TARGET alive and filesystem ready to receive data"
else
  echo "$TARGET offline or filesystem not mounted"
fi

Serviços sem cliente

Às vezes, não há uma maneira fácil de conectar-se ao serviço e você só quer ver se ele aceita conexões TCP de entrada, mas quando você chega telnetao destino na porta em questão, ele fica lá e não desconecta você, o que significa fazer isso em um script faria com que ele travasse.

Embora não seja tão limpo, você ainda pode fazer isso com a ajuda dos programas timeoute netcat. Por exemplo, isso verifica se a máquina aceita conexões SMB / CIFS na porta TCP 445, para que você possa ver se está executando o compartilhamento de arquivos do Windows, mesmo que não tenha uma senha para efetuar login, ou as ferramentas do cliente CIFS não estão ' t instalado:

# Wait 1 second to connect (-w 1) and if the total time (DNS lookups + connect
# time) reaches 5 seconds, assume the connection was successful and the remote
# host is waiting for us to send data.  Connecting on TCP port 445.
if echo 'x' | timeout --preserve-status 5 nc -w 1 "$TARGET" 445; then
  echo "$TARGET alive and CIFS service available"
else
  echo "$TARGET offline or CIFS unavailable"
fi
Malvineous
fonte