Bagaimana saya bisa melakukan ping beberapa alamat IP secara bersamaan?

22

Saya mengetahui metode di mana Anda dapat menjalankan Bash forloop dan pingbeberapa server, apakah ada alat Linux CLI yang dapat saya gunakan yang akan memungkinkan saya untuk melakukan ini tanpa harus menggunakan untuk menulis skrip Bash ke pingdaftar server satu per satu?

Sesuatu seperti ini:

$ ping host1 host2 host3

CATATAN: Saya mencari secara khusus untuk CentOS / Fedora, tetapi jika itu bekerja pada distro lain juga baik-baik saja.

slm
sumber
8
Mengapa Anda menentang skrip satu baris kecil yang melakukan itu - keindahan dan filosofi Linux ;-)? (Dapatkan program kecil dan sederhana, dan tulis sendiri lem untuk kebutuhan khusus.)
Peter - Reinstate Monica
1
Jauh lebih mudah untuk menginstal paket dari repo vs. menyalin skrip ke 2000+ VMs 8-). Saya dapat dengan mudah menulis solusi skrip untuk diri saya sendiri. Juga karena saya menjawab sendiri ini saya membuat konten di Internet karena saya memiliki pengguna yang meminta satu cmd vs skrip shell dan tidak berhasil menemukan A'er sederhana untuk apa yang mereka anggap sebagai Q dasar.
slm
3
Jika niat Anda adalah melakukan multi-ping dari 2000+ VM, ... Saya masih hanya dapat menggaruk kepala saya
Hagen von Eitzen
@HagenvonEitzen - tidak, saya menginstal tooling pada 2000+ VM sehingga pengguna memiliki tooling yang tersedia untuk mereka lakukan.
slm
1
Mengapa Anda membutuhkan ini?
Tvde1

Jawaban:

32

Jika Anda melihat ke dalam proyek NMAP Anda akan menemukan bahwa itu termasuk alat tambahan selain dari adil nmap. Salah satu alat ini adalah nping, yang mencakup kemampuan berikut:

Nping memiliki antarmuka baris perintah yang sangat fleksibel dan kuat yang memberi pengguna kendali penuh atas paket yang dihasilkan. Fitur Nping meliputi:

  • Pembuatan paket TCP, UDP, ICMP dan ARP khusus.
  • Dukungan untuk spesifikasi beberapa target host.
  • Dukungan untuk spesifikasi port target ganda.
  • ...

nping ada dalam repo EPEL standar untuk boot.

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

Pemakaian

Untuk melakukan ping ke beberapa server, Anda hanya perlu memberi tahu npingnama / IP dan protokol mana yang ingin Anda gunakan. Di sini karena kami ingin meniru apa yang pingCLI tradisional lakukan, kami akan menggunakan 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

Satu-satunya kelemahan yang saya temukan dengan alat ini adalah penggunaan mode ICMP yang membutuhkan hak akses root.

$ nping -c 2 --icmp scanme.nmap.org google.com
Mode ICMP requires root privileges.
slm
sumber
3
Ada apa dengan output itu? Statistik mengatakan ia mengirim 2 ke setiap host, tetapi output sebelumnya menunjukkan itu mengirim 3 ke scanme.nmap.org (45.33.32.156) dan 1 ke google.com (64.233.177.100). Itu terjadi pada saya juga ketika saya menjalankannya.
JoL
4
Itu terletak ... (tentu saja, karena tidak konsisten dengan dirinya sendiri). Saat menjalankannya dengan strace, saya bisa melihatnya mengirim ping ke google.com, tetapi mengeluarkan garis yang mengatakan itu mengirimnya ke scanme.nmap.org. Bug yang menarik. Tapi itu tidak selalu terjadi.
JoL
nmapjuga mendukung ICMP secara langsung dengan menentukan opsi -sn. Lihat jawaban saya untuk detailnya.
scai
@scai - terima kasih untuk A'er Anda. Saya menemukan itu juga saat meneliti ini. Saya menemukan pendekatan saya menjadi yang terbersih.
slm
1
'Satu-satunya kelemahan yang saya temukan dengan alat ini adalah penggunaan mode ICMP yang membutuhkan hak akses root.' Ya itu hal yang menarik tetapi itu ada hubungannya dengan kemampuan (setidaknya di Linux; Anda juga bisa melakukan setuid exec untuk root). Bukannya saya merekomendasikan menggunakan setcap atau memberikannya setuid ....
Pryftan
18

fping ada dalam paket Fedora dengan nama yang sama, dan memungkinkan banyak host, atau satu set alamat 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 akan mengirimkan paket ping dan melanjutkan ke target berikutnya dengan cara round-robin ... jika target membalas, dicatat dan dihapus dari daftar

meuh
sumber
9
oping host1 host2 host3

Deskripsi:

oping menggunakan paket ICMP (lebih dikenal sebagai "paket ping") untuk menguji jangkauan host jaringan. Ini mendukung ping beberapa host secara paralel menggunakan IPv4 dan / atau IPv6 secara transparan.

Paket ini berisi dua aplikasi baris perintah: "oping" adalah pengganti untuk alat-alat seperti ping (1), ping6 (1) dan fping (1). "noping" adalah alat berbasis ncurses yang menampilkan statistik saat melakukan ping dan menyoroti waktu bolak-balik yang menyimpang.

GAD3R
sumber
Hanya untuk menjadi bertele-tele: secara teknis ICMP adalah untuk pelaporan kesalahan secara umum dan ada banyak kemampuan berbeda yang dimilikinya. Sebenarnya ping menggunakan jenis ICMP ECHO_REQUEST / ECHO_REPLY (8 untuk iirc lama tapi sudah lama - dan saya terlalu malas untuk memeriksanya). Mungkin deskripsi yang Anda kutip sebenarnya untuk oping itu sendiri, tetapi bagaimanapun juga itu tidak sepenuhnya benar (atau jauh lebih sederhana dari yang seharusnya ... Atau mungkin tidak, saya rasa bagi banyak orang mungkin lebih baik seperti itu tetapi bukan untuk saya juga. ).
Pryftan
7

Saya sarankan menggunakan GNU Parallel

parallel -u ping ::: host1 host2 host3

output akan disisipkan

Diaa Sami
sumber
6

Saya tahu secara spesifik bukan apa yang Anda minta, tetapi skrip bash untuk mencapai ini:

#!/bin/bash

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

wait

Ini akan mengambil titik akhir Anda sebagai argumen baris perintah dan mengirim ping 5 hitungan ke masing-masing sebagai proses latar belakang dan kemudian menunggu semua selesai sebelum keluar. Ini akan mencetak tiga baris terakhir dari hasil ping yang berisi statistik berguna tentang tingkat keberhasilan dan latensi.

Jesse_b
sumber
3
Anda tidak perlu mengingat pids. Sederhana waitakan menunggu semua proses anak aktif, sehingga Anda dapat menghindari loop kedua. Saya pikir bagian dari alasan mengapa diminta untuk tidak memerlukan penulisan skrip bash adalah untuk memiliki solusi yang bekerja pada mesin apa pun tanpa harus membawa atau menulis skrip. Menyingkatnya tampaknya lebih menguntungkan, jadi saya pikir lebih baik untuk menghindari penugasan argumen itu dan lakukan saja for host; dodi loop pertama Anda. Jika ini zsh, Anda dapat menghindari dodan donedan hanya melakukannya, secara interatif:for host in google.com; ping -c5 "$host" |& tail -3 & wait
JoL
4
Perangkap SIGINT akan membuat skrip ini jauh lebih praktis.
Gilles 'SANGAT berhenti menjadi jahat'
2
Untuk penggunaan interaktif, ini hanya menggunakan perintah background (yaitu command &) dalam subkulit (yaitu pembungkus dengan parens) dan dengan waitmenggabungkan sejumlah perintah ke dalam satu perintah buatan, misalnya: (for f in google.com yahoo.com microsoft.com; do ping $f & done; wait). Keluaran mereka akan disisipkan, dan ketika Anda ctrl + c ini setelah perintah ini, ketiga proses anak akan dibunuh. Shell memiliki banyak konstruksi kontrol pekerjaan yang kuat dan ini adalah salah satunya.
Lie Ryan
2
Terima kasih semuanya. Ya saya ragu untuk mempostingnya tetapi saya pikir T / A di sini bukan hanya untuk OP tetapi untuk semua orang yang mengalami masalah yang sama dan saya pikir akan ada orang yang menemukan pertanyaan ini dan tidak ingin menginstal perangkat lunak tambahan untuk menyelesaikan tugas.
Jesse_b
@ JoL Tapi tentu saja alat-alat itu tidak diinstal secara default pada semua host. Itu tidak membuat apa yang Anda katakan tidak benar, tetapi ...
Pryftan
2

Saya kira ini bisa lakukan untuk Anda?

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

Itu mengambil keuntungan dari printfkemampuan untuk "auto-iterate" argumennya sambil menggunakan kembali format string pada setiap argumen. printfOleh karena itu di atas menghasilkan urutan ping <hostname> &string untuk setiap host yang disediakan sebagai argumen, dan mengumpankan urutan perintah tersebut melalui Substitusi Perintah ke evalperintah agar segera dieksekusi.

printfdan evalperintah adalah standar POSIX, serta Substitusi Perintah.

Lampirkan seluruh perintah seperti itu dalam subkulit yang terdiri dari dan-ed waitseperti ini:

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

memberikan kemampuan untuk menginterupsi segalanya sesuka hati dengan yang sederhana Ctrl+C.

Jika tidak, Anda dapat mengontrol setiap pingperintah secara tunggal melalui kontrol pekerjaan shell yang biasa.

Jika shell Anda juga memiliki dukungan untuk Substitusi Proses, Anda juga dapat menggunakan yang berikut:

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

untuk beberapa karakter kurang untuk mengetik.

Intinya sama dengan untuk eval, tetapi mengumpankan urutan pings ke perintah .(alias source) melalui Proses Substitusi.

LL3
sumber
2

Nmap mendukung pemindaian ping (ICMP) dan beberapa host:

nmap -sn -n 127.0.0.1 8.8.8.8

Anda juga dapat membuat file yang berisi semua IP target Anda (dipisahkan oleh spasi atau baris baru) yang disebut targets.txt. Lalu lari:

nmap -sn -n -iL targets.txt

Opsi menjelaskan:

  • -sn Ping Scan.
  • -n Nonaktifkan resolusi DNS.
  • -iL Masukkan nama file.

Opsi menarik lainnya jika Anda ingin melakukan ping ke sejumlah besar target:

  • -T4 Tambah waktu untuk mengurangi durasi pemindaian.
  • --min-parallelism 100 Meningkatkan jumlah probe paralel.
  • -oG <file> Tulis hasil pemindaian ke file dalam format Grepable.

Tanpa membuat file

Ingatlah bahwa Anda juga dapat melupakan pembuatan file dan menggunakan a -untuk mengambil input dari salah satu pipa |,, atau melalui metode tradisional untuk mengarahkan output melalui STDIN.

Contoh:

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

-atau-

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

-atau-

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

Referensi

scai
sumber
2

Dengan menggunakan xargsperintah umum untuk membangun menjalankan beberapa pingpermintaan:

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

Di mana host1 host2 host3bisa sejumlah variabel host (kombinasi IP atau nama host).

Ini mengubah xargsdefault untuk memaksa 1 argumen input per eksekusi ping, dan memungkinkan proses anak paralel yang tidak terbatas (1 per host ping). Mungkin bijaksana untuk mengatur -P(alias --max-procs) ke nilai waras jika bermaksud melakukan ping sejumlah besar host (mereka semua akan diproses; hanya lebih sedikit secara bersamaan).

Cukup pendek untuk digunakan secara langsung, dapat ditambahkan sebagai fungsi ke profil shell atau file rc, atau diubah menjadi skrip kecil di blog Anda $PATH. Dalam contoh di bawah ini, -Ptelah diatur ke 10 untuk menghindari konsumsi sumber daya yang berlebihan.

Contoh skrip: /usr/bin/mping

#!/bin/sh

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

Contoh fungsi di dalam ~/.bashrc

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

Dan gunakan sebagai:

mping host1 host2 host3 ...
Jason Musgrove
sumber
1
Anda mungkin mempertimbangkan menggunakan -w 2 untuk membuat ping tunggu tidak lebih dari 2 detik. Standarnya adalah 10 detik, yang merupakan per-pemanggilan ping, jadi ini bisa memakan waktu lebih dari 30 detik.
Criggie
1
Ya, itu ide yang bagus jika mem-ping lebih banyak host daripada yang Anda tetapkan untuk --max-procs/ -P. Namun, untuk penghitungan host kurang dari -P, semua ping dieksekusi secara paralel - yang berarti bahwa itu akan memakan waktu selama eksekusi ping terpanjang tunggal, daripada jumlah semuanya.
Jason Musgrove
1

Saya tidak tahu persis apa yang Anda inginkan tetapi Anda dapat mengubah 8 bit terakhir yang ditetapkan ke dalam desimal 255, sehingga host Anda akan menerima siaran, sebenarnya, ia akan mengirimkan paket ping ke semua perangkat yang ada di jaringan.

ping -c 1 xx.xx.xx.255
CriticalSYS
sumber
1
Bukan itu yang saya cari.
slm
8
Selamat datang di situs - Ini adalah pemikiran yang bagus dan menunjukkan pemahaman tentang IP Siaran dan tujuannya dalam jaringan IP, dan sepenuhnya benar. Namun itu tidak cocok dengan persyaratan spesifik OP dalam kasus yang didefinisikan secara sempit ini. Silakan lanjutkan dan coba jawab pertanyaan lain.
Criggie
0
ping google.com && ping localhost

Keluaran

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
Manish
sumber
Kelemahan dari ini adalah 1) bahwa &&operator hanya mengizinkan perintah kedua untuk dijalankan jika perintah pertama selesai dengan sukses, (yaitu kode keluar 0) Dan 2) ping pertama tidak akan pernah berakhir tanpa ^ C untuk menghentikannya. Pertimbangkan untuk menambahkan parameter -c dan -w. Selamat datang di situs ini!
Criggie
-1

Hanya untuk bersenang-senang dan untung ...

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

Ini bisa dengan mudah ditingkatkan. Yang membuatnya cukup bermanfaat. :)

Untuk opsi tambahan, lihat halaman manual untuk bsd ping dan Linux ping

HTH

EDIT: sedikit diperbarui untuk mengakhiri ping ping masing-masing @ 6 ping, dan menambahkan opsi halaman manual.

seseorang
sumber
pingPanggilan pertama tidak pernah kembali kecuali jika ada kesalahan fatal.
Gilles 'SANGAT berhenti menjadi jahat'
Sangat? Saya menguji ini sebelum mempostingnya di sini, dan itu berfungsi seperti yang dijelaskan. Anda tahu bahwa tidak setiap host akan merespons ping. Mungkin host yang Anda tanyakan tidak merespons. Bagaimanapun. Dalam upaya memberikan umpan balik yang lebih cepat, saya membatasi permintaan hingga 6 permintaan per host.
seseorang
2
Sekarang setidaknya skrip memiliki peluang untuk berakhir dalam praktek. Tetapi tanpa paralelisme, itu masih sangat tidak berguna. Jika host pertama merespons, pengguna tidak mendapatkan informasi tentang host lain selama 5 detik pertama.
Gilles 'SANGAT berhenti menjadi jahat'
Nah ini dimaksudkan untuk menjadi lebih banyak contoh untuk membangun, sesuai kebutuhan. Saya bisa dengan mudah membuat yang jenuh pipa Anda sepenuhnya. Tetapi apakah itu yang benar-benar Anda cari? :)
seseorang
1
Apa yang seharusnya saya lakukan adalah membuat tautan ke halaman manual ping. Secara jujur. Saya hanya membuatnya sebagai templat yang mudah bagi seseorang untuk dengan mudah memodifikasi dengan caranya sendiri. ping bekerja secara drastis berbeda pada OS yang berbeda, dan di bawah segudang kondisi jaringan berbeda yang masing-masing individu mungkin bekerja di bawah. Jadi tidak ada default "sempurna" untuk semua orang. Masing-masing memiliki "sweet spot" mereka sendiri. :) Apakah saya menyebutkan bahwa itu berfungsi dengan baik untuk saya? ;)
seseorang
-2

Gunakan perintah sederhana di bawah ini:

$ 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
Kevin Li
sumber