Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Scapy ping IP范围_Python_Ping_Scapy - Fatal编程技术网

Python 使用Scapy ping 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

我正在尝试编写一个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'

有人知道我如何解决这个问题吗?或者您对如何使用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)