пинговать несколько IP с помощью bash?


17

У меня есть 10 IP-номеров, которые я должен пинговать ежедневно, чтобы проверить, как я могу это сделать, используя скрипт BASH. Так что я могу автоматизировать эту задачу с помощью cron. Я хочу только BASH-скрипт.

Спасибо.


Ниже ответ я упомянул IP-адреса Google, Yahoo, MSN и т. Д. Я попробовал это сам. Вставка {} и, не работают здесь между IP, чтобы разделить их. надеюсь, что это может помочь кому-то в будущем. Спасибо за чтение.
rɑːdʒɑ

Ответы:


18

Поскольку ваш диапазон ip не имеет симметрии и в нем всего 10 узлов, я бы посоветовал перечислить их в текстовом файле. Я рассматриваю файл, содержащий список, list.txtкоторый содержит список ip один в каждой строке, как показано ниже,

10.12.13.14
172.15.48.3
192.168.45.54
...
48.114.78.227

Вы можете использовать этот скрипт,

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

Чтобы обновить текущее состояние ваших узлов с интервалом в 30 минут, используйте crontab,

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

Вывод 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

разве это не то, что вы ожидали?
souravc

Похоже, это именно то, что OP должен искать ... и поскольку такие сайты, как google.com, yahoo.com и т. д. используют несколько серверов для обработки запросов, было бы лучше пропинговать их своими доменными именами (так что вы, возможно, не будете мне нужно сменить IP в вашем пинг-листе на следующей неделе) ..
точно

Прекрасно работает, я разместил слегка измененный ответ, который я использую в среде Travis CI.
MitchellK


1

Проверьте этот скрипт.

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

Например, чтобы запустить ./script 192.168.1 0 10, он будет проверять ips с 192.168.1.0 до 192.168.1.10, и echo отвечает, если ping в порядке, и не отвечает, если нет.

NB. Вы можете заменить $ 1 $ 2 $ 3 статическими переменными, если диапазон и IP-адреса всегда одинаковы.


IP не из того же диапазона. вот критерии позади. В любом случае, спасибо за ответ. + 1
rʒɑdʒɑ

хорошо, пожалуйста, укажите это в своем вопросе. Спасибо за +
Maythux

Аккуратный и простой скрипт, который может быть очень полезен (например, на встроенных устройствах), даже если он не соответствует 100% условиям вопроса. Спасибо вам. +1 заслуженно.
Сопалахо де Арриерес

1

Предположим, что у вас есть 5 IP (только для уменьшения ответа), тогда вы можете пропинговать их с помощью

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

Примечание: не скручивать скобки, без запятых (,) между IP.

Надеюсь, это поможет.

Пример:

[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

вы не показали реализацию с cron, как упомянуто в вашем Q. также, как этот сценарий уведомил бы результат запросов ping ..
точный

Я упоминал, что хочу только сценарий. Крон не является частью вопроса. Крон упомянул, почему мне нужен этот скрипт, и упомянул цель этого скрипта, так как он был заданием cron.
rɑːdʒɑ

@hash Попробуй, прежде чем спросить моего дорогого друга. Спасибо за поиск.
rɑːdʒɑ

Я никогда не говорил, что сценарий не будет работать ... но, как упоминается в вашем cronзадании Q , необходимо будет уведомить пользователя о результате выполнения задания, или вы предлагаете что-то еще?
Точно

моя цель - работа cron, я имею в виду, зачем мне этот скрипт BASH. но мое требование - bash @hash
rɑːdʒɑ

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

или с помощью grep, видеть только не пингующие узлы

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

1

Что ж

Все просто: используйте parallel --gnu команду, а затем свою команду.

Получите примеры IP:

$ 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.