スクリプトはIPを検索し、「Up」または「Down」ステータスを返します。すべてを2回スキャンしないようにどのように変更できますか?それがある場合は、すべてをスキャンして「up」アドレスのみを返し、もう一度スキャンして「down」ステータスアドレスのみを返します。
#!/bin/bash
is_alive_ping()
{
ping -c 1 $1 > /dev/null
[ $? -eq 0 ] && echo $i,Up
[ $? -eq 1 ] && echo $i,Down
}
for i in 10.1.150.{1..10}
do
is_alive_ping $i & disown
done
誰もがIPのDNS名(利用可能な場合)を返すことができればボーナスポイントになります。
よろしくお願いします。
答え1
あなたが探している地図。
# nmap -sP 10.1.150.1-10
Starting Nmap 5.00 ( http://nmap.org ) at 2012-01-04 00:02 CET
Host foo.example.com (10.1.150.2) is up (0.00066s latency).
Host bar.example.com (10.1.150.7) is up (0.00066s latency).
Nmap done: 10 IP addresses (1 host up) scanned in 1.41 seconds
答え2
スクリプトは各IPを一度だけ検索します。スキャンはバックグラウンドで行われます(&
)。ダウンしたIPは応答に時間がかかるため、後で報告されます。
答え3
応答しないノードに対してpingを再試行すると、コンソール出力にノードの可用性を報告するのに遅延が増大しますが、応答しているオンラインノードはすぐに再報告します。 pingの欠点は、各ホストに対して実行する必要があることです。
ホストで並列pingを実行できるpingのより良い選択肢であるfpingを使用してください。ソースコードはsourceforgeにあります。http://fping.sourceforge.net/。 fpingをダウンロードして/usr/local/sbinにインストールしてsuidにします。
以下は、接続できないノードを最後に報告し、オンラインノードとそのDNS名も報告するPerlの例です。このスクリプトの出力をパイプで接続するか、ツールが目的の出力をgrep
再処理するのを待つことができます。awk
#!/usr/bin/perl
require 'open2.pl';
use Net::IP;
$pid = &open2("OUTPUT","INPUT","/usr/local/sbin/fping -d");
@check=();
my $ip = new Net::IP ('98.137.149.56 - 98.137.149.100') || die "Unable to generate range\n";
do {
push (@check, $ip->ip());
} while (++$ip);
foreach(@check) { print INPUT "$_\n"; }
close(INPUT);
while(<OUTPUT>) {
print "$_";
}
close(OUTPUT);
答え4
追加するとプロセスが速くなります-w
。ping
#!/bin/bash
is_alive_ping()
{
ping -c 1 -w 1 $1 > /dev/null
[ $? -eq 0 ] && echo $i ,Alive
}
for i in 192.168.213.{1..254}
do
is_alive_ping $i &
done