我正在尝试编写一个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范围有任何其他想法,以确定哪些主机在线?
答案 0 :(得分:6)
您只需要确保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
答案 1 :(得分:2)
如果变量的返回值为null,则无法显示reply.src字段。换句话说,您需要验证变量是否返回某个值(如果ping成功)。只有当变量不为null时,才能生成IF条件以获取.src字段。
答案 2 :(得分:0)
FTR,Scapy支持隐式生成器。 这有效:
ans, unans = sr(IP(dst="192.169.0.1-255")/ICMP(), timeout=2)
然后遍历答案。
可能会更好:)