web-dev-qa-db-ja.com

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

Bash forループとping複数のサーバーを実行できる方法を知っています。LinuxCLIツールを使用して、これを行わなくてもこれを実行できます。サーバーのリストを一度に1つずつpingにBashスクリプトを書き込む方法はありますか?

このようなもの:

$ ping Host1 Host2 Host3

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

23
slm

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を送信するには、名前/ IPと使用するプロトコルをnpingに通知するだけです。ここでは、従来のping CLIの動作を模倣したいので、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.
32
slm

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パケットを送信し、ラウンドロビン方式で次のターゲットに移動します...ターゲットが応答すると、そのターゲットが記録され、リストから削除されます

18
meuh
oping Host1 Host2 Host3

説明:

opingはICMPパッケージ( "pingパケット"として知られています)を使用して、ネットワークホストの到達可能性をテストします。 IPv4やIPv6を透過的に使用してparallelで複数のホストにpingすることをサポートします。

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

9
GAD3R

GNU Parallel の使用をお勧めします

parallel -u ping ::: Host1 Host2 Host3

出力はインターリーブされます

8
Diaa Sami

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

#!/bin/bash

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

wait

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

6
jesse_b

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

nmap -sn -n 127.0.0.1 8.8.8.8

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

nmap -sn -n -iL targets.txt

オプションの説明:

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

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

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

ファイルを作成せずに

ファイルの作成を忘れて-を使用して、パイプ、|、または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
scai

これはあなたのためにできると思いますか?

eval $(printf 'ping "%s" & ' Host1 Host2 Host3)

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

printfおよびevalコマンドは、POSIX標準であり、コマンド置換です。

このようなコマンド全体を、次のようにand-ed waitで構成されるサブシェルで囲みます。

(eval $(printf 'ping "%s" & ' Host1 Host2 Host3) && wait)

簡単にすべてを意のままに中断する機能を提供します Ctrl+C

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

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

. <(printf 'ping "%s" & ' Host1 Host2 Host3)

入力する文字が数文字少なくなります。

要点はevalの場合と同じですが、pingsのシーケンスをプロセス置換を通じて.(別名source)コマンドにフィードします。

2
LL3

共通の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 ...
2
Jason Musgrove

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

ping -c 1 xx.xx.xx.255
1
CriticalSYS
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
0
Manish