Bash for
ループとping
複数のサーバーを実行できる方法を知っています。LinuxCLIツールを使用して、これを行わなくてもこれを実行できます。サーバーのリストを一度に1つずつping
にBashスクリプトを書き込む方法はありますか?
このようなもの:
$ ping Host1 Host2 Host3
注:特にCentOS/Fedoraを探していますが、他のディストリビューションでも機能する場合は問題ありません。
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.
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パケットを送信し、ラウンドロビン方式で次のターゲットに移動します...ターゲットが応答すると、そのターゲットが記録され、リストから削除されます
oping Host1 Host2 Host3
opingはICMPパッケージ( "pingパケット"として知られています)を使用して、ネットワークホストの到達可能性をテストします。 IPv4やIPv6を透過的に使用してparallelで複数のホストにpingすることをサポートします。
このパッケージには、2つのコマンドラインアプリケーションが含まれています。「oping」は、ping(1)、ping6(1)、fping(1)などのツールの代替品です。 「noping」は、ping中に統計を表示し、異常な往復時間を強調表示するncursesベースのツールです。
私はそれが具体的にnotがあなたが求めているものであることを知っていますが、これを達成するためのbashスクリプト:
#!/bin/bash
for Host; do
ping -c5 "$Host" 2>&1 | tail -3 &
done
wait
これは、コマンドライン引数としてエンドポイントを取得し、バックグラウンドプロセスとして各エンドポイントに5カウントのpingを送信し、終了する前にすべてが終了するのを待ちます。成功率と待機時間に関する有用な統計を含むping出力の最後の3行を出力します。
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'
これはあなたのためにできると思いますか?
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
の場合と同じですが、ping
sのシーケンスをプロセス置換を通じて.
(別名source
)コマンドにフィードします。
共通の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 ...
正確に何が必要かはわかりませんが、最後の8ビットセットを10進数の255に変更できます。これにより、ホストはブロードキャストを受信し、ネットワークに存在するすべてのデバイスにpingパケットを送信します。
ping -c 1 xx.xx.xx.255
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