スクリプトはIP範囲をスキャンし、結果を任意の形式で返します。

スクリプトはIP範囲をスキャンし、結果を任意の形式で返します。

スクリプトは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

追加するとプロセスが速くなります-wping

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

関連情報