ping plusieurs IP en utilisant bash?


17

J'ai 10 numéros IP que je dois tester quotidiennement pour vérifier, comment je peux le faire en utilisant le script BASH. Pour que je puisse automatiser cette tâche en utilisant cron. Je veux uniquement le script BASH.

Je vous remercie.


Ci-dessous la réponse, j'ai mentionné les IP de Google, yahoo, msn etc. J'ai essayé moi-même. L'insertion de {} et, ne fonctionne pas ici entre les IP pour les séparer. j'espère que cela peut aider quelqu'un à l'avenir. Merci pour la lecture.
rɑːdʒɑ

Réponses:


18

Comme votre plage ip n'a pas de symétrie et qu'il n'y a que 10 nœuds, je suggère de les répertorier dans un fichier texte. Je considère que le fichier contenant la liste est celui list.txtqui contient la liste des ip un à chaque ligne comme indiqué ci-dessous,

10.12.13.14
172.15.48.3
192.168.45.54
...
48.114.78.227

Vous pouvez utiliser ce 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

Pour mettre à jour l'état d'exécution de vos nœuds à un intervalle de 30 minutes, utilisez crontab,

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

Sortie de 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'est-ce pas ce que vous attendiez?
souravc

cela semble être exactement ce que l'OP devrait rechercher. devez changer l'adresse IP dans votre liste de ping la semaine à venir) ..
précis

Fonctionne très bien, j'ai posté une réponse légèrement modifiée que j'utilise dans un environnement Travis CI.
MitchellK


1

Vérifiez ce 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

Pour exécuter ./script 192.168.1 0 10 par exemple, cela vérifiera les ips 192.168.1.0 à 192.168.1.10 et l'écho a répondu si le ping est correct et n'a pas répondu sinon.

NB: Vous pouvez remplacer $ 1 $ 2 $ 3 par des variables statiques si la plage et les IP sont toujours les mêmes.


Les IP ne sont pas de la même plage. c'est les critères derrière. merci pour la réponse. + 1
rɑːdʒɑ

ok, veuillez l'indiquer dans votre question. Merci pour +
Maythux

Un script soigné et simple qui pourrait être très utile (ie: sur des appareils embarqués), même s'il ne répond pas à 100% aux conditions de la question. Merci. +1 mérité.
Sopalajo de Arrierez le

1

Supposons que vous disposez de 5 adresses IP (pour réduire la réponse uniquement), puis vous pouvez

#!/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

Remarque: Pas de crochets, pas de virgules (,) entre les IP.

J'espère que cela pourra aider.

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

vous n'avez pas montré l'implémentation avec cron comme mentionné dans votre Q .. aussi comment ce script notifierait-il le résultat des requêtes ping ..
précis

J'ai mentionné que je ne voulais que du script. Cron ne fait pas partie de la question. Cron a mentionné pourquoi j'avais besoin de ce script et mentionner le but de ce script en tant que travail cron.
rɑːdʒɑ

@hash Essayez-le avant de demander à mon cher ami. Merci d'avoir cherché.
rɑːdʒɑ

Je n'ai jamais dit que le script ne fonctionnerait pas .. mais comme votre Q mentionne le crontravail, un moyen d'informer l'utilisateur du résultat du travail serait nécessaire, ou suggérez-vous autre chose?
précis

mon but est le travail cron, je veux dire pourquoi j'ai besoin de ce script BASH, mais mon exigence est bash @hash
rɑːdʒɑ

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

ou avec grep, voir uniquement les nœuds non ping

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

1

bien

Aussi simple que cela: utiliser parallel --gnu commande puis votre commande.

Obtenez les IP d'exemple:

$ 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.