Bash for
ループとping
複数のサーバーを実行できる方法を知っていますがping
、サーバーのリストにBashスクリプトを書くことなくこれを行うことができるLinux CLIツールがあります一つずつ?
このようなもの:
$ ping host1 host2 host3
注:私は特にCentOS / Fedoraを探していますが、それが他のディストリビューションで動作する場合はそれでも問題ありません。
Bash for
ループとping
複数のサーバーを実行できる方法を知っていますがping
、サーバーのリストにBashスクリプトを書くことなくこれを行うことができるLinux CLIツールがあります一つずつ?
このようなもの:
$ 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を実行するにはnping
、名前/ IPおよび使用するプロトコルを指定するだけです。ここでは、従来の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
pingは、ICMPパッケージ(「pingパケット」と呼ばれる)を使用して、ネットワークホストの到達可能性をテストします。IPv4やIPv6を透過的に使用して、複数のホストへのpingを並行してサポートします。
このパッケージには、2つのコマンドラインアプリケーションが含まれています。「oping」は、ping(1)、ping6(1)、fping(1)などのツールの代替です。「noping」は、pingの実行中に統計情報を表示し、異常な往復時間を強調表示するncursesベースのツールです。
具体的には、あなたが求めているものではなく、これを達成するためのbashスクリプトであることを知っています。
#!/bin/bash
for host; do
ping -c5 "$host" 2>&1 | tail -3 &
done
wait
これにより、エンドポイントがコマンドライン引数として取得され、5カウントのpingが各プロセスにバックグラウンドプロセスとして送信され、終了する前にすべてが終了するまで待機します。成功率と待ち時間に関する有用な統計を含むping出力の最後の3行を出力します。
wait
はすべてのアクティブな子プロセスを待機するため、2番目のループを回避できます。bashスクリプトを記述する必要がないように求められた理由の一部は、スクリプトを実行したり記述したりすることなく、任意のマシンで動作するソリューションを持つことだと思います。短くするほうが好ましいと思われるので、その引数の割り当てを避けてfor host; do
、最初のループで実行する方が良いと思います。これはzshのであれば、あなたは避けることができdo
そしてdone
、ちょうど行い、interatively:for host in google.com; ping -c5 "$host" |& tail -3 & wait
command &
サブシェルでバックグラウンドコマンド(つまり)を使用し(wait
例:括弧で囲む)、with を使用して任意の数のコマンドを1つの人工コマンドに結合します(for f in google.com yahoo.com microsoft.com; do ping $f & done; wait)
。これらの出力はインターリーブされ、このコマンドの後にこれをctrl + cすると、3つの子プロセスすべてが強制終了されます。シェルには強力なジョブ制御構造が多数あり、これもその1つです。
私はこれがあなたのためにできると思う?
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を介して(別名)コマンドにping
s のシーケンスを供給します。.
source
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'
共通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 ...
--max-procs
/に設定したホストよりも多くのホストにpingを送信するのは良い考えです-P
。ただし、ホストカウントが未満の場合-P
、すべてのpingが並行して実行されます。つまり、すべてのpingの合計ではなく、最長で1回のpingの実行にかかる時間がかかります。
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
&&
最初のコマンドが正常に完了した場合にのみオペレーターが2番目のコマンドの実行を許可することです(つまり、終了コード0)。-cおよび-wパラメーターの追加を検討してください。サイトへようこそ!
楽しみと利益のためだけに...
#!/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
致命的なエラーが発生しない限り、最初の呼び出しは戻りません。
以下の簡単なコマンドを使用します。
$ 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