executar ping em vários IP usando o bash?


17

Eu tenho 10 números de IP que tenho que executar ping diariamente para verificar. Como posso fazer isso usando o script BASH. Para que eu possa automatizar essa tarefa usando cron. Quero apenas o script BASH.

Obrigado.


Abaixo resposta, eu mencionei IP's do Google, Yahoo, MSN etc. Eu tentei isso sozinho. Inserir {} e, não está funcionando aqui entre IPs para separá-los. espero que ajude alguém no futuro. Obrigado pela leitura.
rɑːdʒɑ

Respostas:


18

Como seu intervalo de ips não tem simetria e existem apenas 10 nós, sugiro listá-los em um arquivo de texto. Estou considerando que o arquivo que contém a lista é o list.txtque contém a lista de ip um em cada linha, como mostrado abaixo,

10.12.13.14
172.15.48.3
192.168.45.54
...
48.114.78.227

Você pode usar esse script,

#!/bin/bash
# Program name: pingall.sh
date
cat /path/to/list.txt |  while read output
do
    ping -c 1 "$output" > /dev/null
    if [ $? -eq 0 ]; then
    echo "node $output is up" 
    else
    echo "node $output is down"
    fi
done

Para atualizar o status de execução dos nós em um intervalo de 30 minutos, use o crontab,

*/30 * * * * /path/to/pingall.sh > /path/to/log.txt

Saída do log.txt

$ cat /path/to/log.txt
Fri Jan 31 15:06:01 IST 2014
node 10.12.13.14 is up
node 172.15.48.3 is up
node 192.168.45.54 is up
...
node 48.114.78.227 is down

não é o que você estava esperando?
Souravc

isso parece exatamente o que o OP deveria procurar .. e como sites como google.com, yahoo.com etc. usam vários servidores para lidar com solicitações, seria melhor fazer ping deles com seus nomes de domínio (para que você possivelmente não tem que mudar o IP na sua lista de ping na próxima semana) ..
precisa

Funciona muito bem, publiquei uma resposta ligeiramente modificada que uso em um ambiente do Travis CI.
MitchellK


1

Verifique este script.

   #!/bin/bash
    for i in `seq ${2} ${3}`
    do
        ping -c 1 ${1}.${i} > /dev/null 2>&1
        if [ $? -eq 0 ]; then
            echo "${1}.${i} responded."
        else
            echo "${1}.${i} did not respond."
        fi
    done

Para executar ./script 192.168.1 0 10, por exemplo, isso irá verificar os ips 192.168.1.0 a 192.168.1.10 e eco responderá se o ping estiver ok e não responder.

Nota: você pode substituir $ 1 $ 2 $ 3 por variáveis ​​estáticas se o intervalo e os IPs forem sempre os mesmos.


IP não são da mesma faixa. esse é o critério por trás. de qualquer forma obrigado pela resposta. + 1
rɑːdʒɑ 31/01

ok, por favor, indique isso na sua pergunta. Obrigado por +
Maythux

Um script limpo e simples que pode ser muito útil (por exemplo: em dispositivos incorporados), mesmo quando não trata 100% das condições da pergunta. Te agradece. +1 merecido.
Sopalajo de Arrierez

1

Suponha que você possua 5 IPs (para reduzir apenas a resposta) e, em seguida, execute ping com eles.

#!/usr/bin/bash    
for i in xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx xxx.xxx.xxx.xxxx 
do
ping -c 5 $i
done

Nota: Não entre colchetes, sem vírgulas (,) entre IPs.

Espero que ajude.

Ex:

[raja @ scripts]$ cat ping.sh
for i in 74.125.236.70  98.139.183.24  65.55.206.228  91.189.94.156 198.252.206.24
do
ping -c 5 $i 
done 
[raja @ scripts]$ ./ping.sh
PING 74.125.236.70 (74.125.236.70) 56(84) bytes of data.
64 bytes from 74.125.236.70: icmp_seq=1 ttl=128 time=11.5 ms
64 bytes from 74.125.236.70: icmp_seq=2 ttl=128 time=11.0 ms
64 bytes from 74.125.236.70: icmp_seq=3 ttl=128 time=10.9 ms
64 bytes from 74.125.236.70: icmp_seq=4 ttl=128 time=16.5 ms
64 bytes from 74.125.236.70: icmp_seq=5 ttl=128 time=18.2 ms

--- 74.125.236.70 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4025ms
rtt min/avg/max/mdev = 10.966/13.682/18.291/3.120 ms
PING 98.139.183.24 (98.139.183.24) 56(84) bytes of data.
64 bytes from 98.139.183.24: icmp_seq=1 ttl=128 time=244 ms
64 bytes from 98.139.183.24: icmp_seq=2 ttl=128 time=253 ms
64 bytes from 98.139.183.24: icmp_seq=3 ttl=128 time=255 ms
64 bytes from 98.139.183.24: icmp_seq=4 ttl=128 time=251 ms
64 bytes from 98.139.183.24: icmp_seq=5 ttl=128 time=243 ms

--- 98.139.183.24 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4251ms
rtt min/avg/max/mdev = 243.511/249.623/255.275/4.674 ms
PING 65.55.206.228 (65.55.206.228) 56(84) bytes of data.
From 10.22.96.94 icmp_seq=5 Packet filtered

--- 65.55.206.228 ping statistics ---
5 packets transmitted, 0 received, +1 errors, 100% packet loss, time 14002ms

PING 91.189.94.156 (91.189.94.156) 56(84) bytes of data.
64 bytes from 91.189.94.156: icmp_seq=1 ttl=128 time=240 ms
64 bytes from 91.189.94.156: icmp_seq=2 ttl=128 time=240 ms
64 bytes from 91.189.94.156: icmp_seq=3 ttl=128 time=240 ms
64 bytes from 91.189.94.156: icmp_seq=4 ttl=128 time=240 ms
64 bytes from 91.189.94.156: icmp_seq=5 ttl=128 time=240 ms

--- 91.189.94.156 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4242ms
rtt min/avg/max/mdev = 240.060/240.222/240.309/0.626 ms
PING 198.252.206.24 (198.252.206.24) 56(84) bytes of data.
64 bytes from 198.252.206.24: icmp_seq=1 ttl=128 time=237 ms
64 bytes from 198.252.206.24: icmp_seq=2 ttl=128 time=237 ms
64 bytes from 198.252.206.24: icmp_seq=3 ttl=128 time=237 ms
64 bytes from 198.252.206.24: icmp_seq=4 ttl=128 time=237 ms
64 bytes from 198.252.206.24: icmp_seq=5 ttl=128 time=242 ms

--- 198.252.206.24 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4251ms
rtt min/avg/max/mdev = 237.600/238.575/242.291/1.933 ms

você não mostrar a implementação com cron como mencionado em sua Q .. também como é que esse script notificar o resultado dos pedidos de ping ..
precisa

Eu mencionei que eu quero apenas script. Cron não faz parte da questão. Cron mencionou por que eu preciso desse script e para mencionar o objetivo desse script como um trabalho cron.
rɑːdʒɑ

@hash Experimente antes de perguntar ao meu querido amigo. Obrigado por procurar.
rɑːdʒɑ

Eu nunca disse que o script não funcionaria .. mas, como seu Q menciona o crontrabalho, seria necessário um meio de notificar o usuário do resultado do trabalho ou você sugere outra coisa?
precisa

meu propósito é o trabalho cron, eu quero dizer por que eu preciso disso BASH script.but minha exigência é o bash @hash
rɑːdʒɑ

1
echo 192.168.1.1 192.168.1.2 192.168.1.3 | xargs -n1 ping -w 1

ou com grep, veja apenas nós que não são ping

echo 192.168.1.1 192.168.1.2 192.168.1.3 | xargs -n1 ping -w 1 | grep -b1 100

1

Bem

Simples assim: use parallel --gnu comando e depois o seu comando.

Obtenha os IPs de exemplo:

$ dig +trace google.com |ipx

127.0.0.1
127.0.0.1
199.7.91.13
199.7.91.13
192.48.79.30
192.48.79.30
173.194.33.161
173.194.33.165
173.194.33.163
173.194.33.164
173.194.33.174
173.194.33.160
173.194.33.167
173.194.33.166
173.194.33.162
173.194.33.169
173.194.33.168
216.239.32.10
216.239.32.10

$ parallel --gnu ping -c1 ::: `dig +trace google.com |ipx`
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_req=1 ttl=64 time=0.018 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.018/0.018/0.018/0.000 ms
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_req=1 ttl=64 time=0.017 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.017/0.017/0.017/0.000 ms
PING 173.194.33.132 (173.194.33.132) 56(84) bytes of data.
64 bytes from 173.194.33.132: icmp_req=1 ttl=54 time=20.5 ms

--- 173.194.33.132 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 20.526/20.526/20.526/0.000 ms
PING 173.194.33.131 (173.194.33.131) 56(84) bytes of data.
64 bytes from 173.194.33.131: icmp_req=1 ttl=54 time=20.7 ms
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.