ping nhiều IP bằng cách sử dụng bash?


17

Tôi có 10 số IP mà tôi phải ping hàng ngày để kiểm tra, Làm thế nào tôi có thể làm điều đó bằng cách sử dụng tập lệnh BASH. Để tôi có thể tự động hóa nhiệm vụ đó bằng cách sử dụng cron. Tôi chỉ muốn BASH script.

Cảm ơn bạn.


Bên dưới câu trả lời tôi đã đề cập đến IP của Google, yahoo, msn, v.v. Tôi đã tự mình thử nó. Chèn {} và, không hoạt động ở đây giữa các IP để phân tách chúng. hy vọng nó có thể giúp ai đó trong tương lai. Cảm ơn bạn đã đọc.
rɑːdʒɑ

Câu trả lời:


18

Vì phạm vi ip của bạn không có tính đối xứng và chỉ có 10 nút, tôi sẽ đề nghị liệt kê chúng trong một tệp văn bản. Tôi đang xem xét tệp chứa danh sách list.txtchứa danh sách ip một ở mỗi dòng như dưới đây,

10.12.13.14
172.15.48.3
192.168.45.54
...
48.114.78.227

Bạn có thể sử dụng tập lệnh này,

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

Để cập nhật trạng thái chạy của các nút của bạn trong khoảng thời gian 30 phút sử dụng tại crontab,

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

Đầu ra của 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ó không phải là những gì bạn đang mong đợi?
souravc

điều này có vẻ chính xác là những gì OP nên tìm kiếm .. và vì các trang web như google.com, yahoo.com, v.v ... sử dụng nhiều máy chủ để xử lý các yêu cầu, tốt hơn là nên ping chúng bằng tên miền của họ (để bạn có thể sẽ không phải thay đổi IP trong danh sách ping của bạn vào tuần tới) ..
chính xác là

Hoạt động rất tốt, tôi đã đăng một câu trả lời được sửa đổi một chút mà tôi sử dụng trong môi trường Travis CI.
Mitchell


1

Kiểm tra kịch bản này.

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

Ví dụ, để chạy ./script 192.168.1 0 10, điều này sẽ giúp ips 192.168.1.0 thành 192.168.1.10 và phản hồi echo nếu ping vẫn ổn và không phản hồi nếu không.

Lưu ý: Bạn có thể thay thế $ 1 $ 2 $ 3 bằng các biến tĩnh nếu phạm vi và IP luôn giống nhau.


IP không cùng phạm vi. đó là tiêu chí đằng sau mọi cách cảm ơn vì câu trả lời. + 1
rɑːdʒɑ

ok xin vui lòng nói rằng trong câu hỏi của bạn. Cảm ơn +
Maythux

Một tập lệnh gọn gàng và đơn giản có thể rất hữu ích (ví dụ: trên các thiết bị nhúng), ngay cả khi nó không giải quyết 100% các điều kiện của câu hỏi. Cảm ơn bạn. +1 xứng đáng.
Sopalajo de Arrierez

1

Giả sử rằng bạn có 5 IP (chỉ để giảm câu trả lời) thì bạn có thể ping chúng bằng

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

Lưu ý: Không cuộn ngoặc, Không có Dấu phẩy (,) giữa các IP.

Mong rằng sẽ giúp.

Ví dụ:

[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

bạn đã không hiển thị việc triển khai với cron như được đề cập trong Q của bạn .. cũng như cách tập lệnh đó thông báo kết quả của các yêu cầu ping ..
chính xác là

Tôi đã đề cập rằng tôi chỉ muốn kịch bản. Cron không phải là một phần của câu hỏi. Cron đã đề cập đến lý do tại sao tôi cần kịch bản này và đề cập đến mục đích của kịch bản này vì nó là một công việc định kỳ.
rɑːdʒɑ

@hash Hãy thử nó trước khi hỏi người bạn thân yêu của tôi. Cảm ơn bạn đã tìm kiếm.
rdʒɑ

Tôi chưa bao giờ nói rằng kịch bản sẽ không hoạt động .. nhưng vì Q của bạn đề cập đến croncông việc, một phương tiện để thông báo cho người dùng về kết quả của công việc sẽ là cần thiết, hoặc bạn có đề xuất điều gì khác không?
chính xác

Mục đích của tôi là công việc định kỳ, ý tôi là tại sao tôi cần tập lệnh BASH này. Nhưng yêu cầu của tôi là bash @hash
rɑːdʒɑ

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

hoặc với grep, chỉ xem các nút không ping

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

1

Tốt

Đơn giản như vậy: Sử dụng parallel --gnulệnh và sau đó là lệnh của bạn.

Lấy IP của ví dụ:

$ 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.