我正在尝试编写一个脚本,列出我的 LAN 上的所有主机(大约有 20 个),并在每个主机旁边写上 ping 状态。我有 DHCP 租约文件,所以我有所有的 IP(例如,10.0.0.1、10.0.0.2 等),我需要的只是每个主机的 ping 状态。
因此,我的脚本为每个主机启动一次 ping:
ping -c 1 10.0.0.1
不幸的是,当主机离线时,ping 需要很长时间才能超时。我检查了man ping
,似乎有两个选项可以设置超时延迟:-w deadline
和-W timeout
。我想我对后者感兴趣。
所以我尝试了这个:
ping -c 1 -W 1 10.0.0.1
但是每个离线主机等待一秒钟仍然太长了。我尝试将其设置为一秒以下,但它似乎根本没有考虑这个参数:
ping -c 1 -W 0.1 10.0.0.1 # timeout option is ignored, apparently
有没有办法将超时设置为较低的值?如果没有,还有其他选择吗?
编辑
- 操作系统是 Debian Lenny。
- 我尝试 ping 的主机实际上是接入点。它们与用户位于同一 VLAN 和子网中(为了简化部署和替换)。这就是为什么我不想扫描所有子网(例如
ping -b
)。
编辑#2
我接受了这个fping
解决方案(感谢所有其他答案)。这个命令正是我想要的:
fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4
此命令最多需要 500 毫秒才能完成,并同时提供所有主机的 ping 状态:
10.0.0.1 : [0], 84 bytes, 5.71 ms (5.71 avg, 0% loss)
10.0.0.2 : [0], 84 bytes, 7.95 ms (7.95 avg, 0% loss)
10.0.0.3 : [0], 84 bytes, 16.1 ms (16.1 avg, 0% loss)
10.0.0.4 : [0], 84 bytes, 48.0 ms (48.0 avg, 0% loss)
10.0.0.1 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 5.71/5.71/5.71
10.0.0.2 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 7.95/7.95/7.95
10.0.0.3 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 16.1/16.1/16.1
10.0.0.4 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 48.0/48.0/48.0
在 Debian Lenny 上,安装很简单:
aptitude update
aptitude install fping
答案1
平可能比你正在使用的股票 ping 更好。你使用的是什么操作系统?
- “fping 与 ping 的不同之处在于,您可以在命令行上指定任意数量的目标,或者指定包含要 ping 的目标列表的文件。”
- “fping 不会一直向一个目标发送消息直到它超时或回复,而是会发送一个 ping 数据包并以循环方式转到下一个目标。”
- “与 ping 不同,fping 旨在用于脚本,因此其输出设计为易于解析。”
例子:
fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4
-c
发送到每个目标的请求数据包的数量。-t
初始目标超时(以毫秒为单位)
答案2
对于寻求涉及的解决方案的人ping
,请使用-i
开关。
ping -i 0.2 www.google.com
或者,如果你想使用 0.1,你需要以 root 身份运行它
sudo ping -i 0.1 www.google.com
无需下载额外的实用程序。
答案3
timeout
您可以使用Ubuntu/Debian 上的命令设置短暂的超时:
timeout 0.2 ping -c1 fqdn || { do_work }
答案4
使用-w切换,在 Windows 和 Debian 上都是如此。
这是一种快速检查机器是否响应的方法,假设机器将在少于指定的秒数内做出响应。
ping -w 1 192.168.80.105
PING 192.168.80.105 (192.168.80.105) 56(84) bytes of data.
--- 192.168.80.105 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms