该脚本扫描 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