脚本扫描ip范围并以某种格式返回结果

脚本扫描ip范围并以某种格式返回结果

该脚本扫描 IP 并返回“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 的缺点是您需要对每个主机执行它。

使用 fping,这是 ping 的更好替代方案,它可以在主机上进行并行 ping,源代码可以在 sourceforge 上找到http://fping.sourceforge.net/。下载fping并将其安装在/usr/local/sbin下并使其成为suid。

这是一个 perl 示例,它可以在最后报告无法访问的节点,同时报告在线节点及其 dns 名称,您可以将此脚本的输出传递给 或 等工具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

相关内容