Làm cách nào tôi có thể ping nhiều địa chỉ IP cùng một lúc?


22

Tôi biết các phương thức mà bạn có thể chạy một forvòng lặp Bash và pingnhiều máy chủ, có một công cụ Linux CLI mà tôi có thể sử dụng để cho phép tôi làm điều này mà không cần phải viết một tập lệnh Bash vào pingdanh sách các máy chủ cùng một lúc?

Một cái gì đó như thế này:

$ ping host1 host2 host3

LƯU Ý: Tôi đang tìm kiếm cụ thể cho CentOS / Fedora, nhưng nếu nó hoạt động trên các bản phát hành khác thì điều đó cũng tốt.


8
Tại sao bạn lại chống lại một kịch bản một lớp nhỏ làm điều đó - vẻ đẹp và triết lý của Linux ;-)? (Có các chương trình nhỏ, đơn giản và tự viết keo cho những nhu cầu đặc biệt.)
Peter - Tái lập lại

1
Việc cài đặt gói từ repo so với sao chép tập lệnh thành 2000+ VM 8-) dễ dàng hơn nhiều. Tôi có thể dễ dàng viết một giải pháp kịch bản cho chính mình. Ngoài ra, vì tôi tự trả lời rằng tôi đang tạo nội dung trên Internet vì tôi có những người dùng đang yêu cầu một cmd so với tập lệnh shell và không thành công trong việc tìm kiếm một A'er đơn giản cho những gì họ coi là Q. cơ bản.
slm

3
Nếu ý định của bạn là thực hiện đa ping từ hơn 2000 máy ảo, ... tôi vẫn chỉ có thể gãi đầu
Hagen von Eitzen

@HagenvonEitzen - Không, tôi đang cài đặt công cụ trên 2000 máy ảo để người dùng có sẵn công cụ để họ làm như vậy.
slm

1
Tại sao bạn cần điều này?
Tvde1

Câu trả lời:


32

Nếu bạn nhìn vào dự án NMAP, bạn sẽ thấy rằng nó bao gồm các công cụ bổ sung nmap. Một trong những công cụ này là nping, bao gồm các khả năng sau:

Nping có giao diện dòng lệnh rất linh hoạt và mạnh mẽ, cho phép người dùng toàn quyền kiểm soát các gói được tạo. Các tính năng của Nping bao gồm:

  • Tạo gói TCP, UDP, ICMP và ARP tùy chỉnh.
  • Hỗ trợ cho nhiều đặc điểm kỹ thuật máy chủ đích.
  • Hỗ trợ cho nhiều đặc điểm kỹ thuật cổng đích.
  • ...

nping nằm trong repos EPEL tiêu chuẩn để khởi động.

$ repoquery -qlf nmap.x86_64 | grep nping
/usr/bin/nping
/usr/share/man/man1/nping.1.gz

Sử dụng

Để ping nhiều máy chủ, bạn chỉ cần nói npingtên / IP và giao thức nào bạn muốn sử dụng. Ở đây vì chúng tôi muốn bắt chước những gì pingCLI truyền thống sẽ sử dụng ICMP.

$ sudo nping -c 2 --icmp scanme.nmap.org google.com

Starting Nping 0.7.70 ( https://nmap.org/nping ) at 2019-06-14 13:43 EDT
SENT (0.0088s) ICMP [10.3.144.95 > 45.33.32.156 Echo request (type=8/code=0) id=42074 seq=1] IP [ttl=64 id=57921 iplen=28 ]
RCVD (0.0950s) ICMP [45.33.32.156 > 10.3.144.95 Echo reply (type=0/code=0) id=42074 seq=1] IP [ttl=46 id=24195 iplen=28 ]
SENT (1.0091s) ICMP [10.3.144.95 > 45.33.32.156 Echo request (type=8/code=0) id=42074 seq=2] IP [ttl=64 id=57921 iplen=28 ]
SENT (2.0105s) ICMP [10.3.144.95 > 45.33.32.156 Echo request (type=8/code=0) id=42074 seq=2] IP [ttl=64 id=57921 iplen=28 ]
RCVD (2.0107s) ICMP [45.33.32.156 > 10.3.144.95 Echo reply (type=0/code=0) id=42074 seq=2] IP [ttl=46 id=24465 iplen=28 ]
SENT (3.0138s) ICMP [10.3.144.95 > 64.233.177.100 Echo request (type=8/code=0) id=49169 seq=2] IP [ttl=64 id=57921 iplen=28 ]

Statistics for host scanme.nmap.org (45.33.32.156):
 |  Probes Sent: 2 | Rcvd: 2 | Lost: 0  (0.00%)
 |_ Max rtt: 86.053ms | Min rtt: 0.188ms | Avg rtt: 43.120ms
Statistics for host google.com (64.233.177.100):
 |  Probes Sent: 2 | Rcvd: 0 | Lost: 2  (100.00%)
 |_ Max rtt: N/A | Min rtt: N/A | Avg rtt: N/A
Raw packets sent: 4 (112B) | Rcvd: 2 (108B) | Lost: 2 (50.00%)
Nping done: 2 IP addresses pinged in 3.01 seconds

Hạn chế duy nhất tôi tìm thấy với công cụ này là việc sử dụng chế độ ICMP yêu cầu quyền root.

$ nping -c 2 --icmp scanme.nmap.org google.com
Mode ICMP requires root privileges.

3
Sản lượng đó là gì? Các thống kê cho biết họ đã gửi 2 đến mỗi máy chủ, nhưng đầu ra trước đó cho thấy nó đã gửi 3 đến scanme.nmap.org (45.33.32.156) và 1 đến google.com (64.233.177.100). Nó cũng xảy ra với tôi khi tôi chạy nó.
JoL

4
Nó nằm ... (tất nhiên rồi, vì nó không phù hợp với chính nó). Khi chạy nó với strace, tôi có thể thấy nó đang gửi ping đến google.com, nhưng xuất ra một dòng cho biết nó đã gửi nó tới scanme.nmap.org. Lỗi thú vị. Nó không luôn luôn xảy ra, mặc dù.
JoL

nmapcũng hỗ trợ ICMP trực tiếp bằng cách chỉ định tùy chọn -sn. Xem câu trả lời của tôi để biết chi tiết.
scai

@scai - cảm ơn vì A'er của bạn. Tôi tìm thấy một trong những tốt như vậy trong khi nghiên cứu này. Tôi thấy cách tiếp cận của mình là sạch sẽ nhất.
slm

1
'Hạn chế duy nhất tôi tìm thấy với công cụ này là việc sử dụng chế độ ICMP yêu cầu quyền root.' Vâng, đó là một điều thú vị nhưng nó phải liên quan đến các khả năng (ít nhất là trong Linux; bạn cũng có thể thực hiện setuid exec cho root). Không phải tôi khuyên bạn nên sử dụng setcap hoặc cho nó setuid ....
Pryftan

18

fping nằm trong gói Fedora cùng tên và cho phép nhiều máy chủ hoặc một bộ địa chỉ ip.

$ fping -a -A -c 1 hosta hostb
192.168.0.20 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.64/0.64/0.64
192.168.1.3  : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.50/0.50/0.50

fping sẽ gửi một gói ping và chuyển sang mục tiêu tiếp theo theo kiểu vòng tròn ... nếu một mục tiêu trả lời, nó sẽ được ghi chú và xóa khỏi danh sách


9
oping host1 host2 host3

Sự miêu tả:

oping sử dụng các gói ICMP (được gọi là "gói ping") để kiểm tra khả năng tiếp cận của máy chủ mạng. Nó hỗ trợ ping song song nhiều máy chủ bằng cách sử dụng IPv4 và / hoặc IPv6 trong suốt.

Gói này chứa hai ứng dụng dòng lệnh: "oping" là sự thay thế cho các công cụ như ping (1), ping6 (1) và fping (1). "noping" là một công cụ dựa trên ncurses hiển thị số liệu thống kê trong khi ping và làm nổi bật thời gian khứ hồi bất thường.


Nói một cách dễ hiểu: về mặt kỹ thuật, ICMP dành cho báo cáo lỗi nói chung và có nhiều khả năng khác nhau. Trong thực tế, ping sử dụng các loại ICMP ECHO_REQUEST / ECHO_REPLY (8 cho iirc trước đây nhưng đã lâu rồi - và tôi quá lười để kiểm tra). Có thể mô tả mà bạn trích dẫn thực sự là dành cho chính nó nhưng dù cách nào nó không đúng hoàn toàn (hoặc nó đơn giản hơn nhiều so với nó ... Hoặc có thể không, tôi đoán đối với nhiều người có lẽ tốt hơn nhưng không phải đối với tôi ).
Pryftan


6

Tôi biết đó không phải là những gì bạn đang yêu cầu, mà là một kịch bản bash để thực hiện điều này:

#!/bin/bash

for host; do
    ping -c5 "$host" 2>&1 | tail -3 &
done

wait

Điều này sẽ lấy điểm cuối của bạn làm đối số dòng lệnh và gửi ping 5 số cho mỗi điểm làm quá trình nền và sau đó đợi tất cả kết thúc trước khi thoát. Nó sẽ in ba dòng cuối cùng của đầu ra ping chứa các số liệu thống kê hữu ích về tỷ lệ thành công và độ trễ.


3
Bạn không cần phải nhớ các pids. Một đơn giản waitsẽ chờ cho tất cả các tiến trình con đang hoạt động, vì vậy bạn có thể tránh vòng lặp thứ hai. Tôi nghĩ một phần lý do tại sao nó được yêu cầu không yêu cầu viết một tập lệnh bash là để có một giải pháp hoạt động trên bất kỳ máy nào mà không phải mang theo hoặc viết một tập lệnh. Làm cho nó ngắn có vẻ thuận lợi hơn, vì vậy tôi sẽ nghĩ tốt hơn để tránh sự phân công đối số đó và chỉ làm for host; dotrong vòng lặp đầu tiên của bạn. Nếu đây là zsh, bạn có thể tránh được dodonevà chỉ cần làm, interatively:for host in google.com; ping -c5 "$host" |& tail -3 & wait
Jol

4
Một cái bẫy SIGINT sẽ làm cho kịch bản này thực tế hơn rất nhiều.
Gilles 'SO- ngừng trở nên xấu xa'

2
Để sử dụng tương tác, điều này chỉ đơn giản là sử dụng lệnh nền (ví dụ command &) trong một lớp con (nghĩa là gói bằng parens) và waitđể kết hợp bất kỳ số lượng lệnh nào vào một lệnh nhân tạo, ví dụ : (for f in google.com yahoo.com microsoft.com; do ping $f & done; wait). Đầu ra của chúng sẽ được xen kẽ và khi bạn ctrl + c này sau lệnh này, cả ba tiến trình con sẽ bị giết. Shell có rất nhiều cấu trúc kiểm soát công việc mạnh mẽ và đây là một trong số đó.
Nói dối Ryan

2
Cảm ơn tất cả. Vâng, tôi đã do dự khi đăng nó nhưng tôi nghĩ Q / A ở đây không chỉ dành cho OP mà còn cho mọi người gặp vấn đề tương tự và tôi nghĩ sẽ có những người vấp phải câu hỏi này và không muốn cài đặt phần mềm bổ sung để hoàn thành nhiệm vụ.
Jesse_b

@JoL Nhưng chắc chắn những công cụ đó không được cài đặt theo mặc định trên tất cả các máy chủ. Điều đó không làm cho những gì bạn nói không đúng sự thật tất nhiên nhưng ...
Pryftan

2

Tôi cho rằng điều này có thể làm cho bạn?

eval $(printf 'ping "%s" & ' host1 host2 host3)

Nó tận dụng printfkhả năng "tự động lặp lại" các đối số của nó trong khi sử dụng lại chuỗi định dạng của nó qua từng đối số. printfDo đó, ở trên tạo ra một chuỗi các ping <hostname> &chuỗi cho mỗi máy chủ được cung cấp làm đối số và cung cấp chuỗi lệnh đó thông qua Thay thế evallệnh cho lệnh để chúng được thực thi ngay lập tức.

printfevalcác lệnh là tiêu chuẩn POSIX, cũng như thay thế lệnh.

Bao gồm toàn bộ lệnh như vậy trong một khung con bao gồm một và ed waitnhư thế này:

(eval $(printf 'ping "%s" & ' host1 host2 host3) && wait)

cung cấp khả năng làm gián đoạn mọi thứ theo ý muốn một cách đơn giản Ctrl+C.

Khác, bạn có thể điều khiển từng pinglệnh một cách đơn lẻ thông qua kiểm soát công việc thông thường của shell.

Nếu trình bao của bạn cũng hỗ trợ cho Thay thế quy trình, bạn cũng có thể sử dụng như sau:

. <(printf 'ping "%s" & ' host1 host2 host3)

cho một vài ký tự ít để gõ.

Ý chính tương tự như đối với eval, nhưng cung cấp chuỗi pings cho lệnh .(aka source) thông qua Thay thế quy trình.


2

Nmap hỗ trợ quét ping (ICMP) và nhiều máy chủ:

nmap -sn -n 127.0.0.1 8.8.8.8

Bạn cũng có thể tạo một tệp chứa tất cả các IP mục tiêu của bạn (được phân tách bằng dấu cách hoặc dòng mới) được gọi targets.txt. Sau đó chạy:

nmap -sn -n -iL targets.txt

Tùy chọn giải thích:

  • -sn Quét Ping.
  • -n Vô hiệu hóa độ phân giải DNS.
  • -iL Tên tập tin đầu vào.

Các tùy chọn thú vị khác trong trường hợp bạn muốn ping một số lượng mục tiêu thực sự lớn:

  • -T4 Tăng thời gian để giảm thời gian quét.
  • --min-parallelism 100 Tăng số lượng đầu dò song song.
  • -oG <file> Viết kết quả quét vào tập tin ở định dạng Grepable.

Không tạo tập tin

Hãy nhớ rằng bạn cũng có thể từ bỏ việc tạo tệp và sử dụng -để lấy đầu vào từ một đường ống |hoặc thông qua các phương thức truyền thống để chuyển hướng đầu ra qua STDIN.

Ví dụ:

$ ( echo www.google.com; echo www.yahoo.com ) | sudo nmap -sn -n -iL -

-hoặc là-

$ sudo nmap -sn -n -iL - < <(echo www.google.com; echo www.yahoo.com)

-hoặc là-

$ sudo nmap -sn -n -iL - <<< $'www.google.com\nwww.yahoo.com'

Tài liệu tham khảo


2

Bằng cách sử dụng xargslệnh chung để xây dựng một thực thi nhiều pingyêu cầu:

echo host1 host2 host3 | xargs -n1 -P0 ping -c 4

Trường hợp host1 host2 host3có thể là một số lượng lớn các máy chủ (bất kỳ sự kết hợp của IP hoặc tên máy chủ).

Điều này thay đổi xargsmặc định để buộc 1 đối số đầu vào cho mỗi lần thực thi ping và cho phép không giới hạn số lượng tiến trình con song song (1 trên mỗi máy chủ được ping). Có lẽ nên đặt -P(hay còn gọi là --max-procsgiá trị lành mạnh) nếu có ý định ping một số lượng lớn máy chủ (tất cả chúng sẽ được xử lý; chỉ cần ít hơn đồng thời).

Nó đủ ngắn để sử dụng trực tiếp, có thể được thêm dưới dạng một hàm vào hồ sơ shell hoặc tệp RC của bạn hoặc biến thành tập lệnh nhỏ trong tệp của bạn $PATH. Trong các ví dụ dưới đây, -Pđã được đặt thành 10 để tránh tiêu thụ tài nguyên quá mức.

Kịch bản ví dụ: /usr/bin/mping

#!/bin/sh

echo $@ | xargs -n1 -P10 ping -c4

Hàm ví dụ trong ~/.bashrc

function mping() {
    echo $@ | xargs -n1 -P10 ping -c4
} 

Và sử dụng như:

mping host1 host2 host3 ...

1
Bạn có thể cân nhắc sử dụng -w 2 để khiến ping chờ không quá 2 giây. Mặc định là 10 giây, mỗi lần gọi ping, do đó, có thể mất hơn 30 giây để hoàn thành.
Criggie

1
Vâng, đó là một ý tưởng tốt nếu ping nhiều máy chủ hơn bạn đặt cho --max-procs/ -P. Tuy nhiên, đối với số lượng máy chủ ít hơn -P, tất cả các ping đang được thực thi song song - điều đó có nghĩa là sẽ mất nhiều thời gian thực hiện ping dài nhất, thay vì tổng của tất cả chúng.
Jason Musgrove

1

Tôi không biết chính xác những gì bạn muốn nhưng bạn có thể thay đổi 8 bit cuối được đặt thành số thập phân 255, do đó, máy chủ của bạn sẽ nhận được một chương trình phát, thực tế, nó sẽ truyền các gói ping đến tất cả các thiết bị tồn tại trong mạng.

ping -c 1 xx.xx.xx.255

1
Đó không phải là những gì tôi đang tìm kiếm.
slm

8
Chào mừng bạn đến với trang web - Đây là một suy nghĩ tốt và cho thấy sự hiểu biết về IP phát sóng và mục đích của nó trong mạng IP, và hoàn toàn chính xác. Tuy nhiên, nó không phù hợp với yêu cầu cụ thể của OP trong trường hợp được xác định hẹp này. Xin vui lòng tiếp tục và có một vết nứt trong việc trả lời các câu hỏi khác.
Criggie

0
ping google.com && ping localhost

Đầu ra

Pinging google.com [xxxxxxx] with 32 bytes of data:
Reply from xxxxxxx: bytes=32 time=210ms TTL=49
Reply from ::1: time<1ms
Reply from xxxxxxx: bytes=32 time=212ms TTL=49
Reply from ::1: time<1ms
Reply from xxxxxxx: bytes=32 time=211ms TTL=49
Reply from ::1: time<1ms

Nhược điểm của điều này là 1) &&toán tử chỉ cho phép lệnh thứ hai chạy nếu lệnh đầu tiên hoàn thành thành công, (tức là mã thoát 0) và 2) ping đầu tiên sẽ không bao giờ kết thúc mà không có ^ C để ngắt nó. Xem xét thêm một tham số -c và -w. Chào mừng đến với trang web!
Criggie

-1

Chỉ để cho vui và lợi nhuận ...

#!/bin/sh -

# sends six "pings" to a list of hosts defined in "hosts" below

hosts="
host.a
host.b
host.c
host.d
host.e
"

for p in $hosts
do
# ONLY CHOOSE ONE OF THE FOLLOWING, NOT BOTH
# dump results to file
    ping -c 6 $p >>./PINGED
# dump output to console
    ping -c 6 $p
done

exit

Điều này có thể dễ dàng tăng cường. Mà làm cho nó khá hữu ích. :)

Để biết thêm tùy chọn, vui lòng xem các trang hướng dẫn sử dụng ping bsdLinux ping

HTH

EDIT: cập nhật một chút để chấm dứt các truy vấn ping @ 6 ping mỗi lần và thêm tùy chọn trang man.


Cuộc pinggọi đầu tiên không bao giờ trả lại trừ khi nó gặp lỗi nghiêm trọng.
Gilles 'SO- ngừng trở nên xấu xa'

Có thật không? Tôi đã thử nghiệm điều này trước khi đăng nó ở đây, và nó hoạt động như mô tả. Bạn có biết rằng không phải mọi máy chủ sẽ phản hồi việc được ping. Có lẽ các máy chủ bạn yêu cầu không trả lời. Trong bất kỳ trường hợp nào. Trong nỗ lực cung cấp phản hồi nhanh hơn, tôi đã giới hạn 6 truy vấn trên mỗi máy chủ.
ai đó

2
Bây giờ ít nhất kịch bản có cơ hội chấm dứt trong thực tế. Nhưng không có sự song hành, nó vẫn khá vô dụng. Nếu máy chủ đầu tiên phản hồi, người dùng sẽ không nhận được bất kỳ thông tin nào về các máy chủ khác trong 5 giây đầu tiên.
Gilles 'SO- ngừng trở nên xấu xa'

Vâng, điều này được dự định là một ví dụ để xây dựng, như một nhu cầu. Tôi có thể dễ dàng tạo ra một cái khác bão hòa hoàn toàn đường ống của bạn. Nhưng đó có phải là những gì bạn thực sự sau? :)
ai đó

1
Những gì tôi nên làm là tạo một liên kết đến trang ping man. Thành thật. Tôi chỉ tạo nó như một khuôn mẫu dễ dàng cho một người dễ dàng sửa đổi theo cách riêng của họ. ping hoạt động khác nhau đáng kể trên các hệ điều hành khác nhau và trong vô số các điều kiện mạng khác nhau mà mỗi cá nhân có thể đang làm việc. Vì vậy, không có mặc định "hoàn hảo" cho tất cả mọi người. Mỗi người có "điểm ngọt" riêng. :) Tôi đã đề cập rằng nó hoạt động hoàn hảo cho tôi? ;)
ai đó

-2

Sử dụng lệnh đơn giản dưới đây:

$ getip(){ ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' 2>&1 | tee >> /tmp/result.log & }
$ getip 'hostname.number1.net'
$ getip 'hostname.number2.net'
$ getip 'hostname.number3.net'
$ getip 'hostname.number4.net'
$ getip 'hostname.number5.net'
$ getip 'hostname.number6.net'
$ getip 'hostname.number7.net'
$ getip 'hostname.number8.net'
$ cat /tmp/result.log
ABC.DEF.GHI.XY1
ABC.DEF.GHI.XY2
ABC.DEF.GHI.XY3
ABC.DEF.GHI.XY4
ABC.DEF.GHI.XY5
ABC.DEF.GHI.XY6
ABC.DEF.GHI.XY7
ABC.DEF.GHI.XY8
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.