第 1 部分 - “查找 IP”
您的示例范围,132.32.0.3 到 132.32.0.44 不匹配任何子网,这很奇怪。
通常用于检查主机是否正常运行的应用程序通常在子网范围内进行,例如192.168.0.0/28(主机地址:192.168.0.1 到 192.168.0.14)。
如果您想计算子网内的地址,我建议您使用ipaddr。例如:
>>> from ipaddr import IPv4Address, IPNetwork
>>> for a in IPNetwork('192.168.0.0/28').iterhosts():
... print a
...
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
192.168.0.5
192.168.0.6
192.168.0.7
192.168.0.8
192.168.0.9
192.168.0.10
192.168.0.11
192.168.0.12
192.168.0.13
192.168.0.14
但是,如果您确定需要任意范围。您可以将 IPv4 地址转换为整数、递增并转换回点分 IP。例如:
def aton(a):
"""
Change dotted ip address to integer
e.g. '192.168.0.1' -> 3232235521L
"""
return reduce(lambda x,y: (x<<8) + y, [ int(x) for x in a.split('.') ])
def ntoa(n):
"""
Change an integer to a dotted ip address.
e.g. 3232235522L -> '192.168.0.2'
"""
return "%d.%d.%d.%d" % (n >> 24,(n & 0xffffff) >> 16,(n & 0xffff) >> 8,(n & 0xff))
def arbitraryRange(a1,a2):
"""
Generate all IP addresses between two addresses inclusively
"""
n1, n2 = aton(a1), aton(a2)
assert n1 < n2
i = n1
while i <= n2:
yield ntoa(i)
i += 1
提供:
>>> for a in arbitraryRange('192.168.0.10','192.168.0.20'):
... print a
...
192.168.0.10
192.168.0.11
192.168.0.12
192.168.0.13
192.168.0.14
192.168.0.15
192.168.0.16
192.168.0.17
192.168.0.18
192.168.0.19
192.168.0.20
第 2 部分 - “生死攸关”
“活着”或“死去”的问题很复杂,完全取决于这些术语的含义。为了提供上下文和对比,以下是关于 IP 地址/主机的可测试质量列表:
- 响应 ARP 请求?
- 响应 ICMP 回显请求?
- 响应 TCP SYN?