Python 使用Scapy ping IP范围
我正在尝试编写一个Python脚本,它使用Scapy模块ping内部IP范围以确定哪些IP是在线的。到目前为止,我已经做到了:Python 使用Scapy ping IP范围,python,ping,scapy,Python,Ping,Scapy,我正在尝试编写一个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 r
#!/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'
有人知道我如何解决这个问题吗?或者您对如何使用Scapy ping一个IP范围来确定哪些主机在线有什么其他想法吗?您只需要确保
回复
不是非类型<如果等待响应超时,则code>sr1()
返回None
。您还应该在sr1()
中添加一个timeout
,默认超时对于您来说是非常荒谬的
#!/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
如果返回的变量为null,则无法显示reply.src字段。换句话说,您需要验证变量是否返回了某个值(如果ping成功)。只有当变量不为null时,才可以设置IF条件来获取.src字段。FTR,Scapy支持隐式生成器。
这项工作:
ans, unans = sr(IP(dst="192.169.0.1-255")/ICMP(), timeout=2)
然后反复阅读答案
这可能更好:)您的问题与分配sr1(数据包)
的返回值来回复有关。我不熟悉scapy
,因此我无法提供更多的帮助,但从这里开始。packet[IP]不是吗。src打印源IP,即如果您从10.1.1.1 ping到10.1.1.7 ping失败,则回答将是“等待10.1.1.1超时”,而不是“等待10.1.1.7超时”?
ans, unans = sr(IP(dst="192.169.0.1-255")/ICMP(), timeout=2)