Host de ping do LINUX, erro de exibição na falha

4

Estou escrevendo um script bash para fazer o ping de um determinado nome de host, e exibir se o host está ou não ativo (exibir uma mensagem simples). Deve ser fácil, mas a dor de cabeça. Aqui está o que eu tenho até agora:

    echo & echo "DOI (Domain):" &&read input 
    ip=$(ping -c 1 $input | gawk -F'[()]' '/PING/{print $2}') 
    if [ $? -eq 0 ]; then  
        echo "$ip is up";  
    else   
        echo "host is down";  
    fi  
    sleep 60  

Aqui está a saída:
Ping bem sucedido (e resposta), responde:

    74.125.226.119 is up

No entanto, quando não recebe resposta, ainda responde:

    ping: unknown host google.ccccaa 
    is up

em vez de echo "o host está inativo"

Obviamente, tenho negligenciado alguma coisa. Eu odeio fazer perguntas como esta, e tenho certeza que a resposta já está escondida aqui em algum lugar, mas novamente estou parada e não consigo encontrar o que estou procurando. Eu nem tenho certeza do que estou procurando.

EDIT: Resolvido! Obrigado gentilmente pelo conselho útil!

Aqui está a final:

    echo & echo "DOI (Domain):" &&read input    
    output=$(ping -c 1 "$input" 2>/dev/null)  
    if [ $? -eq 0 ]; then  
       ip=$(printf '%s' "$output" | gawk -F'[()]' '/PING/{print $2}'  2>/dev/null )  
       echo "$input ($ip) is up";  
    else  
       echo "Host not found";  
    fi  
    sleep 60  
    
por ICE 02.06.2013 / 15:10

2 respostas

5

Primeiro, você deve adicionar 2>/dev/null à invocação de ping , para que as mensagens de erro de ping não sejam impressas no erro padrão.

Segundo, $? no seu código não conterá o resultado esperado, porque o status de retorno de um pipeline é o status de saída do comando último , que é gawk no seu caso e o status de saída de ping é apenas ignorado. Você poderia reescrever o código, por exemplo, assim:

output=$(ping -c 1 "$input" 2>/dev/null)
if [ $? -eq 0 ]; then
    ip=$(printf '%s' "$output" | gawk -F'[()]' '/PING/{print $2}')  
    echo "$ip is up";
else
    echo "host is down";
fi
    
por 02.06.2013 / 15:22
4

Acho que awk não é necessário. A menos que eu esteja perdendo algo, o código deve fazer o truque:

#!/bin/bash

host=$1
ping -c1 $host > /dev/null 2> /dev/null
[[ $? == 0 ]] && echo "$host is up" || echo "$host is down/not reachable"

Aqui um exemplo:

$ ./checkping www.google.com
www.google.com is up
$ ./checkping www.google.utld
www.google.utld is down/not reachable
    
por 02.06.2013 / 15:18