使用Scapy ping IP范围

时间:2011-09-24 18:33:22

标签: 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 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范围有任何其他想法,以确定哪些主机在线?

3 个答案:

答案 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) 

然后遍历答案。

可能会更好:)