bash kullanarak birden fazla IP ping?


17

Ben kontrol için günlük ping zorunda 10 IP numaraları var, BASH komut dosyası kullanarak bunu nasıl yapabilirim. Böylece bu görevi cron kullanarak otomatikleştirebilirim. Sadece BASH betiği istiyorum.

Teşekkür ederim.


Aşağıda cevap IP, Google, yahoo, msn vb bahsettim. Ben kendim denedim. {} Eklemek ve burada ayırmak için IP'ler arasında çalışmaz. Umarım gelecekte birine yardımcı olabilir. Okuduğunuz için teşekkürler.
rɑːdʒɑ

Yanıtlar:


18

IP aralığınızın simetrisi olmadığı ve sadece 10 düğüm olduğu için bunları bir metin dosyasında listelemenizi öneririz. Listeyi içeren dosyayı list.txtaşağıda gösterildiği gibi her satırda ip bir listesini içeren dosya olduğunu düşünüyorum ,

10.12.13.14
172.15.48.3
192.168.45.54
...
48.114.78.227

Bu komut dosyasını kullanabilirsiniz,

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

Düğümlerinizin çalışma durumunu crontab'da 30 dakika aralıklarla güncellemek için,

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

Log.txt çıktısı

$ 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

beklediğin bu değil miydi?
souravc

Bu OP'nin tam olarak araması gereken şey gibi görünüyor ve google.com, yahoo.com gibi web siteleri istekleri işlemek için birden fazla sunucu kullandığından, alan adlarıyla ping yapmak daha iyi olacaktır (böylece muhtemelen Lütfen ping-listesinde IP gelen hafta) değiştirmek zorunda ..
kesin

Harika çalışıyor, Travis CI ortamında kullandığım biraz değiştirilmiş bir cevap gönderdim.
MitchellK


1

Bu komut dosyasını kontrol edin.

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

Örneğin ./script 192.168.1 0 10'u çalıştırmak için bu, ips 192.168.1.0'dan 192.168.1.10'a kontrol eder ve ping tamamsa yankılanır ve eğer cevap vermezse cevap vermez.

Not: Aralık ve IP'ler her zaman aynıysa $ 1 $ 2 $ 3'ü statik değişkenlerle değiştirebilirsiniz.


IP aynı aralıkta değil. arkasındaki kriterler bu. herhangi bir şekilde cevap için teşekkürler. + 1
rɑːdʒɑ

tamam lütfen sorunuzda belirtin. + İçin teşekkürler
Maythux

Sorunun koşullarını% 100 ele almasa bile, çok yararlı olabilecek düzgün ve basit bir komut dosyası (yani: gömülü aygıtlarda). Teşekkürler. +1 hak etti.
Sopalajo de Arrierez

1

5 IP'niz olduğunu varsayalım (yalnızca cevabı azaltmak için)

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

Not: Parantezleri kıvırmayın, IP'ler arasında Virgül Yok (,).

Umarım yardımcı olur.

Ör:

[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

Q'da belirtildiği gibi cron ile uygulamayı göstermediniz .. ayrıca bu komut dosyası ping isteklerinin sonucunu nasıl bildirir ..
kesin

Sadece senaryo istediğimi söylemiştim. Cron sorunun bir parçası değil. Cron neden bu betiğe ihtiyacım olduğunu ve cron işi olarak bu betiğin amacından bahsetti.
rɑːdʒɑ

@hash Sevgili dostuma sormadan önce deneyin. Baktığınız için teşekkür ederim.
rɑːdʒɑ

Senaryo hiç işe yaramayacağını söylemedim .. ama Q cronişinden bahsederken , kullanıcıyı işin sonucunu bildirmek için bir araç gerekli olurdu, yoksa başka bir şey önerir misin?
kesin

amacım cron işi, yani neden bu BASH betiğine ihtiyacım var. ama benim gereksinimim bash @hash
rɑːdʒɑ

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

veya grep ile, yalnızca ping olmayan düğümlere bakın

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

1

İyi

Bu kadar basit: Kullanım parallel --gnu Önce komutu, sonra komutunuzu kullanın.

Örnek IP'leri alın:

$ 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.