Eu preciso pingar uma lista de endereços IP de um arquivo e registrar o status como "up" ou "down"

1

Estou precisando pingar uma lista de endereços de host (não sequenciais) e registrar a saída como "up" ou "down". Eu tenho um começo, mas meu script parece defeituoso. Por exemplo. Quando executo o script a seguir em um arquivo host contendo 150 hosts, recebo mais de 400 respostas "para cima" ou "para baixo" no arquivo de saída.

#!/usr/bin/bash
#script name: lrkdc01ping.sh
date >> /home/insight/scripts/lrkdc01ping.out
cat /home/insight/scripts/lrkdc01.txt |  while read output
do
    ping -c 1 "$output" >> /dev/null
    if [ $? -eq 0 ]; then
        echo "node is up" >> /home/insight/scripts/lrkdc01ping.out
    else
        echo "node is down" >> /home/insight/scripts/lrkdc01ping.out
    fi
done
    
por mylan 19.06.2018 / 23:18

1 resposta

2

Eu sugeriria algo assim, que também limparia o arquivo de saída de cada execução, em vez de anexá-lo a cada vez:

#!/usr/local/bin/bash
outfile="/home/insight/scripts/lrkdc01ping.out"
date > "$outfile"
while read output; do
    echo -n "$output is " >> "$outfile"
    if ping -c1 "$output" > /dev/null 2>&1; then
        echo "up" >> "$outfile"
    else
        echo "down" >> "$outfile"
    fi
done < /home/insight/scripts/lrkdc01.txt

As principais diferenças estão usando > em vez de >> para a invocação de date , para que você tenha um arquivo limpo para cada execução; e simplificando seu uso do código de saída de ping :

É mais limpo apenas

if verb; then
    action
else
    failure_action
fi

em vez de

verb
if [[ 0 -eq $? ]]; then
    action
else
    failure_action
fi

Além disso, em vez de ter que editar quatro locais caso decida mover ou alterar o nome do arquivo de saída, eu o coloco em uma variável para que você precise atualizá-lo em um só lugar. Minha regra geral é "se você está digitando a mesma coisa mais do que duas vezes, deve ser abstraído".

    
por 19.06.2018 / 23:29