我想要创建bash脚本,它将通过IP的ping列表来验证
问题是,对任何地址的ping都需要几秒钟(万一没有ping回答),尽管我将ping定义为:
Ping –c 1 126.78.6.23上面的例子只执行了一次ping,但问题是时间问题,在ping结束之前等待几秒钟(如果没有答案)。
在我的例子中,这是至关重要的,因为我需要检查150多个IP(通常90%以上的IP没有存活)
所以要检查150个IP,我需要超过500秒
如果有什么好主意如何快速执行ping,请提供建议。
发布于 2014-03-25 19:07:43
最好的方法是并行运行ping,然后将结果保存到一个文件中。在这种情况下,您的脚本运行时间不会超过一秒钟。
for ip in `< list`
do
( ping -c1 $ip || echo ip >> not-reachable ) &
done Update.Solaris -c中的有其他含义,因此对于Solaris,您需要以其他方式运行ping:
ping $ip 57 1(这里,57是数据包的大小,1是要发送的数据包的数量)。
Ping的Solaris语法:
/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;'发布于 2014-03-25 22:43:47
现在Solaris是否使用coreutils OOTB?然后可以使用timeout指定上限:
timeout 0.2s ping -c 1 www.doesnot.exist >/dev/null 2>&1发布于 2014-03-25 19:27:02
您可以使用hping3,它是可编写脚本的(在Tcl中)。
https://stackoverflow.com/questions/22643988
复制相似问题