我想创建bash脚本,它将通过ping IP列表来验证
问题是ping到任何地址都需要几秒钟(如果没有ping应答),尽管我定义了ping如下:
Ping –c 1 126.78.6.23
上面的例子只执行ping一次-但问题是时间,等待几秒钟直到ping结束(如果没有回答)
在我的情况下,这是至关重要的,因为我需要检查超过150个IP(通常超过90%的IP是不活跃的)
检查150个IP需要超过500秒
如果有什么好的建议如何执行ping快速
- 注释我的脚本需要在两个操作系统(linux和solaris)上运行
最好的方法是并行运行ping然后将结果保存在一个文件中。在这种情况下,您的脚本将运行不超过一秒钟。
for ip in `< list`
do
( ping -c1 $ip || echo ip >> not-reachable ) &
done
更新。在Solaris中,-c
具有其他含义,因此对于Solaris,您需要以其他方式运行ping
:
ping $ip 57 1
(这里,57是数据包的大小,1是要发送的数据包的数量)。
Ping的语法:
/usr/sbin/ping -s [-l | -U] [-adlLnrRv] [-A addr_family]
[-c traffic_class] [-g gateway [ -g gateway...]]
[-F flow_label] [-I interval] [-i interface] [-P tos]
[-p port] [-t ttl] host [data_size] [npackets]
你可以创建一个函数来聚合这两个方法:
myping()
{
[ `uname` = Linux ] && ping -c 1 "$i" || ping "$ip" 57 1
}
for ip in `< list`
do
( myping $ip || echo ip >> not-reachable ) &
done
另一种选择,不直接使用ping
,而是使用某些语言的ICMP模块。例如,您可以在Perl中使用Perl + Net::Ping
模块:
perl -e 'use Net::Ping; $timeout=0.5; $p=Net::Ping->new("icmp", $timeout) or die bye ; print "$host is alive n" if $p->ping($host); $p->close;'
这些天Solaris和coreutils
OOTB一起发布了吗?然后可以使用timeout
指定上限:
timeout 0.2s ping -c 1 www.doesnot.exist >/dev/null 2>&1
您可以使用hping3,它是可脚本化的(在Tcl中)。
如前所述,克服时间问题的一个简单方法是并行运行ping命令。
您已经有了Linux (iputils) ping的语法。
对于Solaris,发送单个ping的正确选项是
ping -s 126.78.6.23 64 1
从源代码安装nmap将提供一个更强大的选择。