Determinando se um host está on-line

5

Estou testando a estabilidade de uma máquina e preciso simplesmente escrever um script Bash para determinar se um host está online ou não. Como eu poderia roteirizar isso?

if [ ! $(hostisonline) ]; then
    # profit
fi
    
por Naftuli Kay 13.01.2013 / 09:06

2 respostas

5

Uma solução simples seria:

ping -W 1 $ip

em que -W especifica um tempo limite em segundos.

Certifique-se de que ele seja um maiúscula W. Você também pode usar -i para especificar um tempo de espera em segundos.

    
por 13.01.2013 / 09:37
6

Se o host responder ao ping, teste se estiver online (apenas um exemplo):

ping -c 10 $host

Se os pings não forem retornados / proibidos, eu verificaria serviços individuais por meio do nmap:

nmap $host -p $known_port --max-retries 10 | grep -q open

Por exemplo, para testar se o ssh deve ser aberto, substitua known_port por 22

como para o script poderia ser (o exemplo - é domingo de manhã e estou entediado por isso cresceu um pouco depois de algumas edições - é destinado a testar um monte de hosts, não apenas um):

declare -A SERVER
# SERVER["NAME - Description"]="IP KNOWNPORT"
SERVER["SERVER1 - Client foo"]="111.111.111.111 22"
SERVER["SERVER2 - Client bar"]="222.222.222.222 80"
# ...
# add as many server/port combinations as you'd like

NMAP_MAX_RETRIES=10

printf "========================= ========================= ========== ==========\n"
printf "%25s %25s %10s %10s\n" "Host Description" "IP" "Port" "Status"
printf "========================= ========================= ========== ==========\n"


for server in "${!SERVER[@]}"; do
    set -- ${SERVER["$server"]}
    eval nmap \ -p \ --max-retries $NMAP_MAX_RETRIES | grep -q open
    if [ "$?" == "0" ]; then
        STATUS="[OK]"
    else
        STATUS="*DOWN*" 
    fi
    printf "%25s %25s %10s %10s\n" "$server" "$1" "$2" "$STATUS" 
done

 printf "========================= ========================= ========== ==========\n"

Quando executado, retorna (ips falsos, então os servidores estão inativos):

 ~$ bash /tmp/foo.sh
 ========================= ========================= ========== ==========
          Host Description                        IP       Port     Status
 ========================= ========================= ========== ==========
      SERVER2 - Client bar           222.222.222.222         80     *DOWN*
      SERVER1 - Client foo           111.111.111.111         22     *DOWN*
 ========================= ========================= ========== ==========
    
por 13.01.2013 / 11:30