複数のIPアドレスに同時にpingを実行するにはどうすればよいですか?


22

Bash forループとping複数のサーバーを実行できる方法を知っていますがping、サーバーのリストにBashスクリプトを書くことなくこれを行うことができるLinux CLIツールがあります一つずつ?

このようなもの:

$ ping host1 host2 host3

注:私は特にCentOS / Fedoraを探していますが、それが他のディストリビューションで動作する場合はそれでも問題ありません。


8
なぜあなたはそれをしている小さなワンライナースクリプトに反対しているのですか?Linuxの美しさと哲学;-)?(小さくてシンプルなプログラムを用意し、特別なニーズに合わせて自分で接着剤を書いてください。)
ピーター-モニカの復職

1
スクリプトを2000以上のVMにコピーするよりも、リポジトリからパッケージをインストールする方がはるかに簡単です8-)。自分でスクリプトソリューションを簡単に作成できました。また、私はこれに自己回答したので、単一のcmdとシェルスクリプトを求めているユーザーがいて、基本的なQとして認識されているものに対して単純なA'erを見つけることができなかったため、インターネット上でコンテンツを作成しています
slm

3
あなたの意図は2000+のVMからマルチPINGを行うのであれば、...私はまだだけで私の頭を傷つけることができます
ハーゲン・フォン・Eitzen

@HagenvonEitzen-いいえ、ユーザーがツールを使用できるようにするために、2000以上のVMにツールをインストールしています。
slm

1
なぜこれが必要なのですか?
Tvde1

回答:


32

NMAPプロジェクトを見ると、に加えて追加のツールが含まれていることがわかりますnmap。これらのツールの1つにnping、次の機能が含まれます。

Npingには、生成されたパケットをユーザーが完全に制御できる、非常に柔軟で強力なコマンドラインインターフェイスがあります。Npingの機能は次のとおりです。

  • カスタムTCP、UDP、ICMP、およびARPパケットの生成。
  • 複数のターゲットホスト仕様のサポート。
  • 複数のターゲットポート仕様のサポート。
  • ...

nping 起動するための標準EPELリポジトリにあります。

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

使用法

複数のサーバーにpingを実行するにはnping、名前/ IPおよび使用するプロトコルを指定するだけです。ここでは、従来のpingCLIの機能を模倣するため、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

このツールで見つかった唯一の欠点は、ルート権限を必要とするICMPモードの使用です。

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

3
その出力には何がありますか?統計によると、各ホストに2を送信しましたが、前の出力は3をscanme.nmap.org(45.33.32.156)に、1をgoogle.com(64.233.177.100)に送信したことを示しています。それは私がそれを実行するときにも私に起こります。
JoL

4
それは...(もちろん、それ自体と矛盾しているので)。straceで実行すると、google.comにpingを送信していますが、scanme.nmap.orgに送信したことを示す行を出力しています。興味深いバグ。ただし、常に発生するとは限りません。
JoL

nmapまた、オプションを指定することでICMPを直接サポートします-sn。詳細については私の答えをご覧ください。
scai

@scai-A'erに感謝します。これを調査しているときにも見つけました。私のアプローチが最もクリーンであることがわかりました。
slm

1
「このツールで発見した唯一の欠点は、ルート権限が必要なICMPモードの使用です。」はい、それは興味深いことですが、機能に関係しています(少なくともLinuxでは、rootに対してsetuid execを実行することもできます)。setcapの使用またはsetuidの提供をお勧めするわけではありません....
Pryftan

18

fpingは同じ名前のFedoraパッケージにあり、多くのホストまたは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はpingパケットを送信し、ラウンドロビン方式で次のターゲットに移動します...ターゲットが応答すると、それが記録され、リストから削除されます


9
oping host1 host2 host3

説明:

pingは、ICMPパッケージ(「pingパケット」と呼ばれる)を使用して、ネットワークホストの到達可能性をテストします。IPv4やIPv6を透過的に使用して、複数のホストへのpingを並行してサポートします。

このパッケージには、2つのコマンドラインアプリケーションが含まれています。「oping」は、ping(1)、ping6(1)、fping(1)などのツールの代替です。「noping」は、pingの実行中に統計情報を表示し、異常な往復時間を強調表示するncursesベースのツールです。


技術的にはICMPは一般的にエラー報告用であり、ICMPにはさまざまな機能があります。実際、pingはECHO_REQUEST / ECHO_REPLYタイプのICMPを使用します(以前のiircの場合は8ですが、長い時間がかかりました-確認するのが面倒です)。たぶんあなたが引用する説明は実際にはoping自体に関するものですが、いずれにしても厳密に正しいわけではありません(または、本来よりもはるかに単純化されています...またはそうでないかもしれません。 )。
プリフタン


6

具体的に、あなたが求めているものではなく、これを達成するためのbashスクリプトであることを知っています。

#!/bin/bash

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

wait

これにより、エンドポイントがコマンドライン引数として取得され、5カウントのpingが各プロセスにバックグラウンドプロセスとして送信され、終了する前にすべてが終了するまで待機します。成功率と待ち時間に関する有用な統計を含むping出力の最後の3行を出力します。


3
PIDを覚えておく必要はありません。シンプルwaitはすべてのアクティブな子プロセスを待機するため、2番目のループを回避できます。bashスクリプトを記述する必要がないように求められた理由の一部は、スクリプトを実行したり記述したりすることなく、任意のマシンで動作するソリューションを持つことだと思います。短くするほうが好ましいと思われるので、その引数の割り当てを避けてfor host; do、最初のループで実行する方が良いと思います。これはzshのであれば、あなたは避けることができdoそしてdone、ちょうど行い、interatively:for host in google.com; ping -c5 "$host" |& tail -3 & wait
JOL

4
SIGINTトラップは、このスクリプトをより実用的にします。
ジル「SO-悪であるのをやめる」

2
インタラクティブに使用する場合、これは単にcommand &サブシェルでバックグラウンドコマンド(つまり)を使用し(wait例:括弧で囲む)、with を使用して任意の数のコマンドを1つの人工コマンドに結合します(for f in google.com yahoo.com microsoft.com; do ping $f & done; wait)。これらの出力はインターリーブされ、このコマンドの後にこれをctrl + cすると、3つの子プロセスすべてが強制終了されます。シェルには強力なジョブ制御構造が多数あり、これもその1つです。
ライライアン

2
皆さんありがとう。投稿するのをためらいましたが、ここにあるQ / AはOPだけでなく、同様の問題を経験しているすべての人に当てはまると思います。タスクを達成するために。
Jesse_b

@JoLしかし、これらのツールはすべてのホストにデフォルトでインストールされるわけではありません。...あなたはもちろんの虚偽なく、言うことはありません
Pryftan

2

私はこれがあなたのためにできると思う?

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

それはを活用しprintf、各引数の上にそのフォーマット文字列を再利用しながら、 『自動反復』の能力の引数を。printfしたがって、上記では、ping <hostname> &引数として提供される各ホストの文字列のシーケンスが生成され、コマンドの置換を介してコマンドのシーケンスがコマンドに渡され、evalコマンドがすぐに実行されます。

printfそしてevalコマンドはPOSIX標準だけでなく、コマンド置換されています。

このようなコマンド全体を、次のwaitようなand-edを含むサブシェルで囲みます。

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

簡単なものですべてを自由に中断する能力を提供しますCtrl+C

それ以外の場合はping、シェルの通常のジョブ制御を使用して、各コマンドを単独で制御できます。

シェルがプロセス置換もサポートしている場合は、次も使用できます。

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

入力する文字数が少ないため。

要点はの場合と同じですがeval、Process Substitutionを介して(別名)コマンドにpings のシーケンスを供給します。.source


2

Nmapはpingスキャン(ICMP)および複数のホストをサポートします。

nmap -sn -n 127.0.0.1 8.8.8.8

また、と呼ばれるすべてのターゲットIP(スペースまたは改行で区切られた)を含むファイルを作成することもできますtargets.txt。次に実行します:

nmap -sn -n -iL targets.txt

オプションの説明:

  • -sn Pingスキャン。
  • -n DNS解決を無効にします。
  • -iL 入力ファイル名。

本当に多数のターゲットをpingする場合のその他の興味深いオプション:

  • -T4 スキャン期間を短縮するには、タイミングを増やします。
  • --min-parallelism 100 並列プローブの数を増やします。
  • -oG <file> スキャン結果をGrepable形式でファイルに書き込みます。

ファイルを作成せずに

また、ファイルの作成を省略し、aを使用し-てパイプ|、またはSTDINを介して出力をリダイレクトする従来の方法から入力を取得することもできます。

例:

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

-または-

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

-または-

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

参照資料


2

共通xargsコマンドを使用して、複数の実行ping要求を作成することにより:

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

どこhost1 host2 host3にホストの可変数(IPまたはホスト名の任意の組み合わせ)にすることができます。

これにより、xargsデフォルトが変更され、pingの実行ごとに1つの入力引数が強制され、無制限の数の並列子プロセス(pingされたホストごとに1つ)が許可されます。多数のホストにpingを実行する場合は、-P(別名--max-procs)を適切な値に設定するのが賢明です(それらはすべて処理されますが、同時に少数になります)。

直接使用するのに十分短いため、シェルプロファイルまたはrcファイルに関数として追加するか、で小さなスクリプトに変換できます$PATH。以下の例では、-P過剰なリソース消費を避けるために10に設定されています。

サンプルスクリプト: /usr/bin/mping

#!/bin/sh

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

内の関数の例 ~/.bashrc

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

そして次のように使用します:

mping host1 host2 host3 ...

1
-w 2を使用して、pingを2秒以内に待機させることを検討できます。デフォルトは10秒です。これはpingの呼び出しごとであるため、完了するまでに30秒以上かかる場合があります。
クリギー

1
はい、--max-procs/に設定したホストよりも多くのホストにpingを送信するのは良い考えです-P。ただし、ホストカウントが未満の場合-P、すべてのpingが並行して実行されます。つまり、すべてのpingの合計ではなく、最長で1回のpingの実行にかかる時間がかかります。
ジェイソンマスグローブ

1

私はあなたが何を望んでいるか正確にはわかりませんが、最後の8ビットセットを10進数の255に変更することができますので、ホストはブロードキャストを受信し、実際には、ネットワークに存在するすべてのデバイスにpingパケットを送信します。

ping -c 1 xx.xx.xx.255

1
それは私が探しているものではありません。
slm

8
サイトへようこそ-これは良い考えであり、IPネットワークにおけるブロードキャストIPとその目的の理解を示しており、完全に正しいです。ただし、この厳密に定義されたケースでは、OPの特定の要件と一致しません。続けて、他の質問に答えてください。
クリギー

0
ping google.com && ping localhost

出力

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

これの欠点は、1)&&最初のコマンドが正常に完了した場合にのみオペレーターが2番目のコマンドの実行を許可することです(つまり、終了コード0)。-cおよび-wパラメーターの追加を検討してください。サイトへようこそ!
クリギー

-1

楽しみと利益のためだけに...

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

これは簡単に拡張できます。これは非常に便利です。:)

追加オプションについては、bsd pingおよびLinux pingのマニュアルページを参照してください。

HTH

編集:pingクエリ@ 6 pingそれぞれを終了し、manページのオプションを追加するためにわずかに更新されました。


ping致命的なエラーが発生しない限り、最初の呼び出しは戻りません。
ジル「SO-悪であるのをやめる」

本当に?ここに投稿する前にこれをテストし、説明どおりに機能しました。すべてのホストがpingに応答するとは限りません。おそらく、問い合わせたホストが応答しなかったのでしょう。いかなる場合でも。より迅速なフィードバックを提供するために、クエリをホストごとに6つの要求に制限しました。
誰か

2
これで、少なくともスクリプトは実際には終了する可能性があります。しかし、並列性がなければ、それはまだかなり役に立たない。最初のホストが応答した場合、ユーザーは最初の5秒間は他のホストに関する情報を取得しません。
ジル「SO-悪であるのをやめる」

さて、これは、必要に応じて、より多くの例に基づいて作成することを目的としていました。パイプを完全に飽和させる別のものを簡単に作成できます。しかし、それはあなたが本当に望んでいることですか?:)
誰か

1
私は何をすべきやったことのpingのmanページへのリンクを作成することです。正直に。私はそれを簡単なテンプレートとして作成し、自分の手段で簡単に変更できるようにしました。pingは、OSが異なると、各個人が作業している可能性のある無数の異なるネットワーク条件の下で劇的に異なります。したがって、すべての人にとって「完璧な」デフォルトはありません。それぞれに独自の「スイートスポット」があります。:)それは私にとって完璧に機能することを言及しましたか?;)
だれか

-2

以下の簡単なコマンドを使用します。

$ 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.