Se você estiver usando ping
apenas para determinar se o nome do host fornecido está acessível ou não, você pode fazer isso:
if ping -c 1 "$otherhost" >/dev/null 2>&1; then
printf 'The host "%s" is reachable\n' "$otherhost"
else
printf 'The host "%s" is not reachable\n' "$otherhost"
fi
Isso envia um único pacote ECHO_REQUEST
para o host fornecido em "$otherhost"
e usa o status de saída de ping
para determinar se o utilitário conseguiu executar sua tarefa ou não. Toda saída comum de ping
é descartada.
Observe que, se ping
não conseguir consultar outro host, isso não significa que o host esteja definitivamente desativado ou não seja roteável. Pode simplesmente estar ignorando o pacote ECHO_REQUEST
.
Se você deseja produzir o erro real produzido por ping
na falha, você pode fazer isso da seguinte maneira para evitar ter que chamar o utilitário duas vezes (como os erros de rede às vezes são transitórios, uma segunda invocação de ping
pode não estar falhando ou pode estar falhando de uma maneira diferente):
pingerr=$(mktemp)
if ping -c 1 "$otherhost" >/dev/null 2>"$pingerr"; then
printf 'The host "%s" is reachable\n' "$otherhost"
else
printf 'The host "%s" is not reachable\n' "$otherhost"
if [ -s "$pingerr" ]; then
echo 'ping error:'
cat "$pingerr"
fi
fi
rm -f "$pingerr"
Isso salva qualquer mensagem de diagnóstico de ping
em um arquivo temporário que será posteriormente gerado se ping
falhar (se houver algo nele, que é o teste de -s
). O arquivo sempre será criado (mesmo que permaneça vazio), por isso, o removemos depois da if
-statement.
Usando esse método, você também pode analisar o arquivo de saída de erro da maneira que desejar. Por exemplo:
pingerr=$(mktemp)
if ping -c 1 "$otherhost" >/dev/null 2>"$pingerr"; then
printf 'The host "%s" is reachable\n' "$otherhost"
else
printf 'The host "%s" is not reachable\n' "$otherhost"
if [ -s "$pingerr" ]; then
printf 'ping says'
sed 's/^[^:]*//' <"$pingerr"
fi
fi
rm -f "$pingerr"
Aqui, em vez de apenas enviar a mensagem original de ping
, removemos o bit antes do primeiro :
antes de imprimi-lo.