Birden fazla IP adresini aynı anda nasıl pingleyebilirim?


22

Bash fordöngüsünü ve pingbirden fazla sunucuyu çalıştırabileceğiniz yöntemlerin farkındayım, kullanabileceğim bir Linux CLI aracı var ve bunu pingbir sunucu listesine Bash komut dosyası yazmaya gerek kalmadan yapmam için izin verecek her seferinde bir tane?

Bunun gibi bir şey:

$ ping host1 host2 host3

NOT: Özellikle CentOS / Fedora'yı arıyorum, ancak diğer dağıtımlarla da çalışıyorsa, sorun değil.


8
Neden Linux'un güzelliğini ve felsefesini; (Küçük, basit programlara sahip olun ve özel ihtiyaçlar için yapıştırıcıyı kendiniz yazın.)
Peter - Reinstate Monica

1
Bir depodan bir paket yüklemek, bir betiği 2000'den fazla VM'ye kopyalamak çok daha kolaydır 8-). Kolayca kendim için bir senaryo çözümü yazabilirim. Ayrıca bunu kendi kendime cevapladığımdan beri internette içerik yapıyorum çünkü bir kabuk betiğine karşı tek bir cmd isteyen ve temel bir Q olarak algıladıkları şeyi basit bir A'er bulmakta başarısız olan kullanıcılarım var.
slm


@HagenvonEitzen - hayır, 2000 + VM'lere takım yüklüyorum, böylece kullanıcılar bu şekilde kendilerine uygun takımlara sahip olacaklar.
slm

1
Neden buna ihtiyacınız var?
Tvde1

Yanıtlar:


32

NMAP projesine bakarsanız , sadece üstüne ek araçlar içerdiğini göreceksiniz nmap. Bu araçlardan biri nping, aşağıdaki yetenekleri içerir:

Nping, kullanıcılara oluşturulan paketler üzerinde tam kontrol sağlayan çok esnek ve güçlü bir komut satırı arayüzüne sahiptir. Nping'in özellikleri şunları içerir:

  • Özel TCP, UDP, ICMP ve ARP paket üretimi.
  • Birden çok hedef ana bilgisayar belirtimi için destek.
  • Birden çok hedef port belirtimi için destek.
  • ...

nping standart EPEL depolarında boot edilir.

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

kullanım

Birden fazla sunucuya ping atmak için sadece npingisimleri / IP'leri ve kullanmak istediğiniz protokolü söylemeniz gerekir. Burada, geleneksel pingCLI'nin ne yaptığını taklit etmek istediğimizden, ICMP'yi kullanacağız.

$ 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

Bu araçla bulduğum tek dezavantajı, kök ayrıcalıkları gerektiren ICMP modunun kullanılmasıdır.

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

3
Bu çıktı ne? İstatistikler her ana bilgisayara 2 gönderdiğini ancak önceki çıktıda scanme.nmap.org (45.33.32.156) için 3 ve google.com'a (64.233.177.100) 1 gönderdiğini gösteriyor. Çalıştırdığımda da başıma geliyor.
JoL

4
Yalanlar ... (elbette, kendisiyle tutarsız olduğu için). Strace ile çalıştırırken, google.com'a bir ping gönderdiğini ancak scanme.nmap.org adresine gönderdiğini söyleyen bir satır çıktığını görebiliyorum. İlginç bir böcek. Yine de her zaman olmaz.
JoL

nmapayrıca, seçeneği belirterek doğrudan ICMP'yi de destekler -sn. Ayrıntılar için cevabımı gör .
scai

@scai - A'er için teşekkürler. Bunu araştırırken bunu da buldum. En temiz olmak için yaklaşımımı buldum.
slm

1
'Bu araçla bulduğum tek dezavantajı, kök ayrıcalıkları gerektiren ICMP modunun kullanılması.' Evet, bu ilginç bir şey, ancak yeteneklerle ilgili olmalı (en azından Linux'ta; root için execuid exec de yapabilirsiniz). Setcap kullanmanızı veya setuid vermenizi tavsiye etmiyorum ....
Pryftan

18

fping , aynı addaki bir Fedora paketinde bulunur ve birçok ana bilgisayara veya bir ip adreslerine izin verir.

$ 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 bir ping paketi gönderecek ve bir sonraki hedefe geçecek şekilde robin şeklinde ilerleyecektir ... eğer bir hedef cevap verirse, not edilir ve listeden çıkarılır


9
oping host1 host2 host3

Açıklama:

oping, ağ ana bilgisayarlarının erişilebilirliğini test etmek için ICMP paketlerini ("ping paketleri" olarak da bilinir) kullanır. Şeffaf olarak IPv4 ve / veya IPv6 kullanarak paralel olarak birden fazla ana bilgisayara ping atmayı destekler .

Bu paket iki komut satırı uygulaması içerir: "oping", ping (1), ping6 (1) ve fping (1) gibi araçların yerine geçer. "noping", pinging sırasında istatistikleri gösteren ve normal olmayan gidiş geliş sürelerini vurgulayan, ncurses tabanlı bir araçtır.


Sadece bilgili olmak: teknik olarak ICMP genel olarak hata raporlama içindir ve sahip olduğu birçok farklı özellik vardır. Aslında, ping, ECHO_REQUEST / ECHO_REPLY ICMP türlerini kullanır (eski iirc için 8, ancak uzun zaman oldu - ve kontrol edemeyecek kadar tembelim). Belki de teklif ettiğin açıklama aslında operasyonun kendisi içindir ama her iki durumda da kesinlikle doğru değildir (ya da olması gerekenden çok daha basit ... Ya da belki de değil, sanırım çoğu için bu şekilde daha iyi ama yine de benim için değil. ).
Pryftan


6

Özel olarak istediğin şeyin bu olmadığını biliyorum , ama bunu başarmak için bir bash betiği:

#!/bin/bash

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

wait

Bu, uç noktalarınızı komut satırı argümanları olarak alır ve her birine arka plan işlemi olarak 5 sayım ping gönderir ve çıkmadan önce herkesin bitmesini bekler. Ping çıktısının son üç satırını basar, başarı oranı ve gecikmeyle ilgili faydalı istatistikler içerir.


3
Pids'i hatırlamana gerek yok. waitTüm aktif alt işlemler için basit bir bekleyiş olacaktır, böylece ikinci döngüden kaçınabilirsiniz. Bir bash betiği yazmanın gerekmemesinin istenmesinin nedeninin bir parçası, bir betiği taşımak veya yazmak zorunda kalmadan herhangi bir makinede çalışan bir çözüme sahip olmaktır. Kısa yapmak daha elverişli görünüyor, bu yüzden bu tartışma atamasından kaçınmanın ve sadece for host; doilk döngünüzde yapmanın daha iyi olacağını düşünüyorum . Eğer bu zsh olsaydı, dodonefor host in google.com; ping -c5 "$host" |& tail -3 & wait
etkileşimli olarak

4
Bir SIGINT tuzağı bu senaryoyu çok daha pratik hale getirirdi.
Gilles 'SO- kötülük yapmayı bırak'

2
Etkileşimli kullanım için, bu basitçe arka plan komutu (yani kullanan command &bir alt kabuk (Pars ile yani sarma) ve birlikte) waitörneğin, bir yapay komuta içine komutları herhangi bir sayıda birleştirmek: (for f in google.com yahoo.com microsoft.com; do ping $f & done; wait). Onların çıktıları serpiştirilecek ve bu komuttan sonra bunu ctrl + c yaptığınızda, üç alt işlemin tümü öldürülecek. Kabuğun çok güçlü iş kontrol yapıları var ve bu onlardan biri.
Yalan Ryan

2
Herkese teşekkürler. Evet, göndermekte tereddütlüydüm ama burada Q / A'nın sadece OP için değil, benzer bir problem yaşayan herkes için olduğunu düşünüyorum ve bu soruya rastlayan ve ek yazılım yüklemek istemeyen insanlar olacağını düşünüyorum. görevi başarmak için.
Jesse_b

@JoL Ancak kesinlikle bu araçlar varsayılan olarak tüm ana bilgisayarlara yüklenmez. Tabii ki doğru söylediklerini
yapmazsın

2

Sanırım bunun senin için yapabileceğini?

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

Bu yararlanır printfher argüman üzerindeki biçim dizesi yeniden kullanırken bağımsız değişkenleri 'otomatik' döngü için bireyin yeteneği. Bu printfnedenle yukarıdakiler ping <hostname> &, argüman olarak sağlanan her ana bilgisayar için bir dizi dizisi üretir ve bu tür bir komut dizisini Komut Değiştirme yoluyla evalderhal çalıştırmalarını emrederek besler .

printfve evalkomutlar POSIX standardı ve ayrıca Komuta Değiştirme.

Bu komutun tamamını, aşağıdaki gibi bir ve içeren bir alt kabuk içine yerleştirme wait:

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

Her şeyi irade ile basit bir şekilde kesmek için yeteneği sağlar Ctrl+C.

Aksi takdirde, her bir pingkomutu kabuğun normal iş kontrolü ile tek tek kontrol edebilirsiniz.

Kabuğunuzun İşlem Değişiklikleri için de desteği varsa, aşağıdakileri de kullanabilirsiniz:

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

birkaç karakter yazmak için daha az.

Oysa, ile aynıdır eval, ancak pings sırasını İşlem Değiştirme yoluyla .(aka source) komutuna besler .


2

Nmap , ping taramalarını (ICMP) ve birden fazla ana bilgisayarı destekler:

nmap -sn -n 127.0.0.1 8.8.8.8

Ayrıca, çağrılan tüm hedef IP'lerinizi (boşluklarla veya yeni satırlarla ayrılmış) içeren bir dosya da oluşturabilirsiniz targets.txt. O zaman koş:

nmap -sn -n -iL targets.txt

Seçenekler açıklandı:

  • -sn Ping Taraması.
  • -n DNS çözünürlüğünü devre dışı bırakın.
  • -iL Giriş dosyası adı.

Gerçekten çok sayıda hedefe ping atmak istemeniz durumunda diğer ilginç seçenekler:

  • -T4 Tarama süresini azaltmak için zamanlamayı arttırın.
  • --min-parallelism 100 Paralel prob sayısını arttırın.
  • -oG <file> Grepable formatında dosyaya tarama sonuçlarını yazın.

Dosya oluşturmadan

Ayrıca bir dosya oluşturmayı da bırakabileceğinizi ve -bir boruyu girdi almak |için veya STDIN aracılığıyla çıktıyı yönlendirmek için geleneksel yöntemler kullanarak bir yöntem kullanabileceğinizi unutmayın.

Örnekler:

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

-veya-

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

-veya-

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

Referanslar


2

xargsBirden çok pingistek yürütmek için ortak komutu kullanarak :

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

Burada host1 host2 host3ana değişken sayıda (veya IP herhangi bir kombinasyonu olabilir).

Bu, xargsping yürütme başına 1 giriş argümanını zorlamak için varsayılanları değiştirir ve sınırsız sayıda paralel alt işleme izin verir (pinged ana bilgisayar başına 1). Çok sayıda ana bilgisayara ping işlemi yapmak istiyorsa -P(aka --max-procs) aklı başında bir değere ayarlamak akıllıca olacaktır (hepsi aynı anda daha az işlenecektir).

Doğrudan kullanmak için yeterince kısa, kabuk profilinize veya rc dosyanıza bir işlev olarak eklenebilir veya içindeki küçük komut dosyasına dönüştürülebilir $PATH. Aşağıdaki örneklerde, -Paşırı kaynak tüketimini önlemek için 10'a ayarlanmıştır.

Örnek komut dosyası: /usr/bin/mping

#!/bin/sh

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

İçindeki örnek fonksiyon ~/.bashrc

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

Ve şu şekilde kullanın:

mping host1 host2 host3 ...

1
Ping'in 2 saniyeden fazla beklemesini sağlamak için -w 2'yi kullanmayı düşünebilirsiniz. Varsayılan değer 10 saniyedir, bu da ping çağırma başınadır, bu işlemin tamamlanması 30+ saniye sürebilir.
Criggie

1
Evet, --max-procs/ için belirlediğinizden fazla ana bilgisayara ping atmak iyi bir fikirdir -P. Bununla birlikte, ev sahibi sayıları daha az olduğu için -P, tüm ping'lerin paralel olarak yürütüldüğü anlamına gelir - bu, hepsinin toplamından ziyade, en uzun ping işleminin süresi kadar süreceği anlamına gelir.
Jason Musgrove

1

Tam olarak ne istediğinizi bilmiyorum ama son 8 bitlik seti 255 ondalık basamağa değiştirebilirsin, böylece ana bilgisayarlarınız bir yayın alacaktır, aslında, ping paketlerini bir ağdaki tüm cihazlara iletecektir.

ping -c 1 xx.xx.xx.255

1
Aradığım şey bu değil.
slm

8
Siteye Hoş Geldiniz - Bu iyi bir düşüncedir ve IP Yayını ve IP ağındaki amacının anlaşıldığını gösterir ve tamamen doğrudur. Ancak, bu dar tanımlanmış durumda OP'nin özel gereksinimi ile uyuşmuyor. Lütfen devam edin ve diğer soruları yanıtlarken bir sorun yaratın.
Criggie

0
ping google.com && ping localhost

Çıktı

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

Bunun dezavantajları 1) &&operatörün yalnızca ilk komutun başarılı bir şekilde tamamlanması durumunda ikinci komutun çalışmasına izin vermesidir (yani, bir çıkış kodu 0) ve 2) ilk ping bir ^ C olmadan kesilmeyecektir. Bir -c ve -w parametresi eklemeyi düşünün. Siteye Hoşgeldiniz!
Criggie

-1

Sadece eğlence ve kazanç için ...

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

Bu kolayca geliştirilebilir. Bu da oldukça kullanışlı kılar. :)

Diğer seçenekler için lütfen bsd ping ve Linux ping man sayfalarına bakınız.

HTH

EDIT: Ping sorgularını sonlandırmak için hafifçe güncellendi ve her biri 6 ping'e eklendi ve man sayfası seçeneklerini ekleyin.


İlk pingçağrı, önemli bir hatayı almadığı sürece asla geri dönmez.
Gilles 'SO- kötülük yapmayı bırak'

Gerçekten mi? Buraya göndermeden önce bunu test ettim ve açıklandığı gibi çalıştı. Biliyorsun ki, her ev sahibi sinirlenmeye cevap vermeyecek. Belki de sorguladığınız ana bilgisayarlar cevap vermiyordu. Her durumda. Daha hızlı geri bildirim sağlamak için sorguları ana bilgisayar başına 6 istekle sınırlandırdım.
Biri

2
Şimdi en azından senaryoda pratikte sonlandırma şansı var. Ancak paralellik olmadan, hala oldukça işe yaramaz. İlk ana bilgisayar yanıt verirse, kullanıcı ilk 5 saniye boyunca diğer ana bilgisayarlar hakkında herhangi bir bilgi alamaz.
Gilles 'SO- kötülük yapmayı bırak'

Peki, bu ihtiyaç üzerine inşa etmek için daha fazla örnek olması amaçlanmıştır. Borunuzu tamamen doyuran başka birisini kolayca oluşturabilirim. Ama gerçekte peşinde olduğunuz şey bu mu? :)
Biri

1
Yapmam gereken şey, ping man sayfasına bir link oluşturmak. Dürüst. Bunu sadece kendi araçları için kolayca değiştirmesi için kolay bir şablon olarak yarattım. Ping çalışır ölçüde farklı işletim sistemleri üzerinde farklı ve her birey altında çalışan olabileceğini farklı ağ koşulları sayısız altında. Dolayısıyla herkes için "mükemmel" bir varsayılan yoktur. Her birinin kendi "tatlı yeri" vardır. :) Benim için mükemmel çalıştığını söylemiş miydim? ;)
Biri

-2

Basit komutun altında kullanın:

$ 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
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.