eseguire il ping di più IP utilizzando bash?


17

Ho 10 numeri IP che devo fare quotidianamente il ping per controllare, come posso farlo usando lo script BASH. In modo che io possa automatizzare quell'attività usando cron. Voglio solo lo script BASH.

Grazie.


Sotto la risposta ho citato gli IP di Google, Yahoo, msn ecc. Ci ho provato io. L'inserimento di {} e, non sta funzionando qui tra gli IP per separarli. spero che possa aiutare qualcuno in futuro. Grazie per aver letto.
rʒɑdʒɑ

Risposte:


18

Poiché il tuo intervallo ip non ha simmetria e ci sono solo 10 nodi, suggerirei di elencarli in un file di testo. Sto considerando che il file che contiene l'elenco list.txtcontiene l'elenco di ip uno per ogni riga, come mostrato di seguito,

10.12.13.14
172.15.48.3
192.168.45.54
...
48.114.78.227

Puoi usare questo 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

Per aggiornare lo stato di esecuzione dei tuoi nodi a un intervallo di 30 minuti, utilizza crontab,

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

Output di 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

non è quello che ti aspettavi?
souravc,

questo sembra esattamente ciò che OP dovrebbe cercare ... e poiché i siti Web come google.com, yahoo.com, ecc. utilizzano più server per gestire le richieste, sarebbe meglio eseguire il ping con i loro nomi di dominio (in modo che possibilmente non devi cambiare l'IP nella tua ping-list la prossima settimana) ..
preciso

Funziona benissimo, ho pubblicato una risposta leggermente modificata che uso all'interno di un ambiente Travis CI.
MitchellK,


1

Controlla questo 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

Per eseguire ./script 192.168.1 0 10, ad esempio, questo controllerà gli ips da 192.168.1.0 a 192.168.1.10 e l'eco ha risposto se il ping è ok e non ha risposto in caso contrario.

NB: puoi sostituire $ 1 $ 2 $ 3 con variabili statiche se l'intervallo e gli IP sono sempre gli stessi.


IP non provengono dallo stesso intervallo. questo è il criterio alla base. in ogni caso grazie per la risposta. + 1
rɑːdʒɑ

ok per favore affermalo nella tua domanda. Grazie per +
Maythux,

Uno script pulito e semplice che potrebbe essere molto utile (ad esempio: su dispositivi integrati), anche quando non risolve al 100% le condizioni della domanda. Grazie. +1 meritato.
Sopalajo de Arrierez,

1

Supponiamo di avere 5 IP (per ridurre solo la risposta), quindi puoi effettuare il ping con

#!/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: non arricciare le parentesi, nessuna virgola (,) tra gli IP.

Spero possa aiutare.

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

non hai mostrato l'implementazione con cron come menzionato nel tuo Q .. anche come lo script avrebbe notificato il risultato delle richieste di ping ..
preciso il

Ho detto che voglio solo sceneggiatura. Cron non fa parte della domanda. Cron ha menzionato il motivo per cui ho bisogno di questo script e di menzionare lo scopo di questo script come un lavoro cron.
rʒɑdʒɑ

@hash Provalo prima di chiedere al mio caro amico. Grazie per aver guardato.
rʒɑdʒɑ

Non ho mai detto che lo script non funzionerà .. ma dato che il tuo Q menziona il cronlavoro, sarebbe necessario un mezzo per avvisare l'utente del risultato del lavoro o suggerisci qualcos'altro?
preciso il

il mio scopo è cron job, intendo perché ho bisogno di questo script BASH, ma il mio requisito è bash @hash
rɑːdʒɑ

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

o con grep, vedi solo nodi non ping

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

1

Bene

Semplice: usa il parallel --gnucomando e poi il tuo comando.

Ottieni gli IP di esempio:

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.