Python 实际上有一个非常好的方法,它会“在网络中的可用主机上返回一个迭代器”。(将 strict 设置为 false 会遍历所有 IP)
例如:
import subprocess
import ipaddress
subnet = ipaddress.ip_network('192.168.1.0/24', strict=False)
for i in subnet.hosts():
i = str(i)
subprocess.call(["ping", "-c1", "-n", "-i0.1", "-W1", i])
等待间隔 (-i0.1) 可能对自动化很重要,即使是一秒超时 (-t1) 也可能永远超过 .0/24
编辑:所以,为了跟踪 ICMP(ping)请求,我们可以这样做:
#!/usr/bin/env python
import subprocess
import ipaddress
alive = []
subnet = ipaddress.ip_network('192.168.1.0/23', strict=False)
for i in subnet.hosts():
i = str(i)
retval = subprocess.call(["ping", "-c1", "-n", "-i0.1", "-W1", i])
if retval == 0:
alive.append(i)
for ip in alive:
print(ip + " is alive")
这将返回如下内容:
192.168.0.1 is alive
192.168.0.2 is alive
192.168.1.1 is alive
192.168.1.246 is alive
即所有响应 ICMP 的 IP 都在整个 /23 范围内——非常酷!