我正在尝试编写一个 Python 脚本,该脚本使用 Scapy 模块来 ping 内部 IP 范围以确定哪些 IP 在线。到目前为止我已经得到了这个:
#!/usr/bin/python
from scapy.all import *
conf.verb = 0
for ip in range(0, 256):
packet = IP(dst="192.168.0." + str(ip), ttl=20)/ICMP()
reply = sr1(packet)
if "192.168." in reply.src:
print reply.src, "is online"
程序会静置一段时间,什么都不做,然后如果我用 CTRL+C 杀死它,我会收到一条错误消息:
Traceback (most recent call last):
File "sweep.py", line 7, in <module>
if "192.168." in reply.src:
AttributeError: 'NoneType' object has no attribute 'src'
但是,如果我尝试使用单个 IP 地址而不是范围,它就会起作用。像这样:
#!/usr/bin/python
from scapy.all import *
conf.verb = 0
packet = IP(dst="192.168.0.195", ttl=20)/ICMP()
reply = sr1(packet)
if "192.168." in reply.src:
print reply.src, "is online"
有人知道如何解决这个问题吗?或者您对如何使用 Scapy ping IP 范围以确定哪些主机在线有任何其他想法吗?
您只需确保
reply
不是 NoneType
,如下所示...如果您等待响应超时,则 sr1()
返回 None
。您还应该添加一个 timeout
到 sr1()
,默认超时对于您的目的来说是相当荒谬的。
#!/usr/bin/python
from scapy.all import *
TIMEOUT = 2
conf.verb = 0
for ip in range(0, 256):
packet = IP(dst="192.168.0." + str(ip), ttl=20)/ICMP()
reply = sr1(packet, timeout=TIMEOUT)
if not (reply is None):
print reply.dst, "is online"
else:
print "Timeout waiting for %s" % packet[IP].dst
如果变量返回为空,则无法显示reply.src字段。换句话说,您需要验证变量是否返回了某个值(如果 ping 成功)。仅当变量不为空时,您可以创建 IF 条件来获取 .src 字段。
FTR,Scapy 支持隐式生成器。 这有效:
ans, unans = sr(IP(dst="192.169.0.1/24")/ICMP(), timeout=2)
然后迭代答案。