向子网中的每个IP发送ping测试。

69

有没有基于命令行的方式来向子网中的每台计算机发送ping?类似于

for(int i = 1; i < 254; i++)
    ping(192.168.1.i);

如何强制进行ARP解析?


请检查此博客文章(http://nomius.blogspot.com/2006/06/checking-network-with-bash.html)是否包含您所需的内容。 - Ólafur Waage
6
使用原生的方式,无需第三方工具:for i in $(seq 1 254); do ping -c1 -t 1 192.168.11.$i; done。该命令用于对IP地址范围内的设备进行ping测试,范围为192.168.11.1到192.168.11.254。 - user285594
14个回答

128

并非所有的机器都有nmap,但它是进行网络发现的绝佳工具,而且肯定比独立使用ping命令更好。

$ nmap -n -sP 10.0.0.0/24

开始 Nmap 4.20 ( http://insecure.org )(时间:2009-02-02 07:41 CST)
主机 10.0.0.1 看起来正常。
主机 10.0.0.10 看起来正常。
主机 10.0.0.104 看起来正常。
主机 10.0.0.124 看起来正常。
主机 10.0.0.125 看起来正常。
主机 10.0.0.129 看起来正常。
Nmap 完成:256 个 IP 地址(6 台主机)在 2.365 秒内扫描完毕。

迄今为止最佳答案,因为它是第一个与现实兼容的答案,即并非所有子网都具有相同的大小,并且使用/24符号可以推广到任何大小的子网。 - Liudvikas Bukys
1
Nmap并非所有机器/服务器都可用,而ping则是。这个小问题使得该选项不是最佳答案。但如果两个工具都存在,则可以选择此选项。 - kszosze
这个命令可能会丢失一些主机,但可以使用 ping 来确认,为什么? - Honghe.Wu
1
可以只用 nmap -sn 10.0.0.0/24 吗?这样就不会进行 DNS 查询(-n),并且根据 nmap 手册 的说明,_在之前的 Nmap 版本中,-sn 被称为 -sP_。 @Honghe.Wu 有些主机被配置为不回答 ping。 - Pablo Bianchi
这比ping快得多。 - Elliott B

78

我建议使用fping的掩码选项,因为您没有限制ping。

fping -g 192.168.1.0/24

响应结果在脚本中易于解析:

192.168.1.1 is alive
192.168.1.2 is alive
192.168.1.3 is alive
192.168.1.5 is alive
...
192.168.1.4 is unreachable
192.168.1.6 is unreachable
192.168.1.7 is unreachable
...
注意:使用参数-a将限制输出为可达的IP地址,否则fping还将打印不可达地址。
fping -a -g 192.168.1.0/24

来自man手册:

  

fpingping的不同之处在于,您可以在命令行上指定任意数量的目标,或者指定包含目标列表的文件进行ping。 fping不会像ping一样只发送到一个目标直到超时或回复,而是以循环方式向下一个目标发送ping数据包。

更多信息:http://fping.org/


1
另外,fping比nmap更轻。 - urnenfeld
如果你只想看到可达地址列表,而不是单独的ping结果,请使用"-aq"。 - 黄雨伞

49

广播 ping:

$ ping 192.168.1.255
PING 192.168.1.255 (192.168.1.255): 56 data bytes
64 bytes from 192.168.1.154: icmp_seq=0 ttl=64 time=0.104 ms
64 bytes from 192.168.1.51: icmp_seq=0 ttl=64 time=2.058 ms (DUP!)
64 bytes from 192.168.1.151: icmp_seq=0 ttl=64 time=2.135 ms (DUP!)
...

(在Linux上添加-b选项)


2
请注意:根据版本/平台的不同,您可能需要在其中添加一个“-b”。 - Mark Renouf
4
并非所有操作系统都会默认响应广播ping。 - Mark Renouf

20

我刚看到这个问题,但回答并没有让我满意。所以我自己写了一个:

echo $(seq 254) | xargs -P255 -I% -d" " ping -W 1 -c 1 192.168.0.% | grep -E "[0-1].*?:"
  • 优点 1:您不需要安装任何其他工具
  • 优点 2:非常快。它并行执行所有操作,并且每个ping的超时时间为1秒("-W 1")。所以它将在1秒内完成:)
  • 优点 3:输出结果如下
64 bytes from 192.168.0.16: icmp_seq=1 ttl=64 time=0.019 ms
64 bytes from 192.168.0.12: icmp_seq=1 ttl=64 time=1.78 ms
64 bytes from 192.168.0.21: icmp_seq=1 ttl=64 time=2.43 ms
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=1.97 ms
64 bytes from 192.168.0.11: icmp_seq=1 ttl=64 time=619 ms

编辑: 这里是相同的脚本,适用于当您的xargs没有-P标志的情况,例如在openwrt中(我刚刚发现)。

for i in $(seq 255);
do
 ping -W 1 -c 1 10.0.0.$i | grep 'from' &
done

18
在Bash shell中:
#!/bin/sh

COUNTER=1

while [ $COUNTER -lt 254 ]
do
   ping 192.168.1.$COUNTER -c 1
   COUNTER=$(( $COUNTER + 1 ))
done

2
这不应该是 $COUNTER -lt 255 来测试 192.168.1.254 吗? - chux - Reinstate Monica

10

命令行实用程序nmap也可以做到这一点:

nmap -sP 192.168.1.*

你需要将参数用引号括起来。 - toolforger

7
for i in $(seq 1 254); do ping -c1 -t 1 192.168.11.$i; done

添加-t 1参数只等待一秒钟就退出。如果您只连接了几个设备到该子网,这将大大提高速度。


1
非常好。1)它是本地的 2)我不必安装 Arduino 中所有那些垃圾工具。 - user285594
我也喜欢它使用在有限系统上发现的裸露工具。对于OpenWRT用户,请记住-t参数变成了ping-w - Adam Sibik

6
FOR /L %i in (1,1,254) DO PING 192.168.1.%i -n 1 -w 100 | for /f "tokens=3 delims=: " %j in ('find /i "TTL="') do echo %j>>IPsOnline.txt

哪个 shell 有大写的 FOR 和这种奇怪的语法?我认为边缘技术必须明确地注明。 - pabouk - Ukraine stay strong

6
这是对@david-rodríguez-dribeas上面答案的修改,它可以并行运行所有ping(速度更快),并且仅显示返回ping的IP地址的输出。
export COUNTER=1
while [ $COUNTER -lt 255 ]
do
    ping $1$COUNTER -c 1 -w 400 | grep -B 1 "Lost = 0" &
    COUNTER=$(( $COUNTER + 1 ))
done

3

在Linux下,我认为ping -b 192.168.1.255会起作用(192.168.1.255是192.168.1.*的广播地址),但据我所知,在Windows下无法使用该命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接