Python 2.7+;第2.3.1条

Python 2.7+;第2.3.1条,python,scapy,Python,Scapy,我正在尝试使用scapy,但我不知道为什么有些函数不起作用: from scapy.layers.inet import * a = Ether() / IP(dst='192.168.1.1') / ICMP() a.show() 结果: Traceback (most recent call last): File "/home/user/PycharmProjects/untitled/main.py", line 7, in <module> a.show()

我正在尝试使用
scapy
,但我不知道为什么有些函数不起作用:

from scapy.layers.inet import *
a = Ether() / IP(dst='192.168.1.1') / ICMP()
a.show()
结果:

Traceback (most recent call last):
  File "/home/user/PycharmProjects/untitled/main.py", line 7, in <module>
    a.show()
  File "/usr/lib/python2.7/dist-packages/scapy/packet.py", line 819, in show
###[ Ethernet ]###
    reprval = f.i2repr(self,fvalue)
  File "/usr/lib/python2.7/dist-packages/scapy/fields.py", line 191, in i2repr
    x = self.i2h(pkt, x)
  File "/usr/lib/python2.7/dist-packages/scapy/layers/l2.py", line 88, in i2h
    x = conf.neighbor.resolve(pkt,pkt.payload)
  File "/usr/lib/python2.7/dist-packages/scapy/layers/l2.py", line 38, in resolve
    return self.resolvers[k](l2inst,l3inst)
  File "/usr/lib/python2.7/dist-packages/scapy/layers/inet.py", line 727, in <lambda>
    conf.neighbor.register_l3(Ether, IP, lambda l2,l3: getmacbyip(l3.dst))
  File "/usr/lib/python2.7/dist-packages/scapy/layers/l2.py", line 56, in getmacbyip
    iff,a,gw = conf.route.route(ip)
AttributeError: 'NoneType' object has no attribute 'route'
也行


我尝试了一些其他函数,如
.show
,但有时会出现此错误。为什么?

我认为您缺少一个步骤,您的第一行指定了如何构造一个或多个数据包,show尝试解析接收到的数据包

尝试以下方法:

from scapy.layers.inet import *
a = Ether() / IP(dst='192.168.1.1') / ICMP() # Rule for creating packets
s,r = sr1(a) # Send & Receive one packet(s)
r.show() # Show the recieved packet(s)

这将使用您的规则构造单个数据包,发送它并捕获回复,然后显示实际的数据包。

您需要导入所有内容,因此请尝试更改您的导入语句,如下所示:

$ sudo python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from scapy.all import *
WARNING: No route found for IPv6 destination :: (no default route?)
>>> a = Ether() / IP(dst='192.168.1.1') / ICMP()
>>> a.show()
###[ Ethernet ]###
  dst       = 74:11:d5:04:1b:82
  src       = 80:f6:df:59:3d:35
  type      = 0x800
###[ IP ]###
     version   = 4
     ihl       = None
     tos       = 0x0
     len       = None
     id        = 1
     flags     = 
     frag      = 0
     ttl       = 64
     proto     = icmp
     chksum    = None
     src       = 192.168.0.5
     dst       = 192.168.1.1
     \options   \
###[ ICMP ]###
        type      = echo-request
        code      = 0
        chksum    = None
        id        = 0x0
        seq       = 0x0
>>> 

在链接层中填充有效的默认值是很明智的。当您不导入整个模块时,它无法优雅地处理问题

如果您只需稍微更改代码,这样它就不需要执行该检查,它将构建您的数据包

from scapy.layers.inet import *
a = Ether(src='AA:AA:AA:AA:AA:AA', dst='BB:BB:BB:BB:BB:BB') / IP(src='192.168.1.1') / ICMP()
a.show()
它进行回溯(最后一次调用):文件“/home/inck/PycharmProjects/untitled/main.py”,第7行,在s中,r=sr1(a)#发送和接收一个数据包文件“/usr/lib/python2.7/dist packages/scapy/sendrecv.py”,第334行,在sr1 s=conf.L3socket(filter=filter,nofilter=nofilter,iface=iface)文件中“/usr/lib/python2.7/dist packages/scapy/arch/linux.py”,第307行,在init self.ins=socket.socket(socket.AF_PACKET,socket.SOCK_RAW,socket.htons(type))[…]socket.Errno 1]操作不被允许您需要超级用户(root)权限,因为它创建了一个套接字。只需sudo,您就可以开始了。
from scapy.layers.inet import *
a = Ether(src='AA:AA:AA:AA:AA:AA', dst='BB:BB:BB:BB:BB:BB') / IP(src='192.168.1.1') / ICMP()
a.show()