스크립트는 IP 범위를 스캔하고 결과를 어떤 형식으로 반환합니다.

스크립트는 IP 범위를 스캔하고 결과를 어떤 형식으로 반환합니다.

스크립트는 IP를 검색하고 "Up" 또는 "Down" 상태를 반환합니다. 모든 것을 두 번 스캔하지 않도록 어떻게 변경할 수 있습니까? 그것이 자리잡으면 모든 것을 스캔하고 "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

관련 정보