Python 从scapy数据包获取信息字符串

Python 从scapy数据包获取信息字符串,python,python-2.7,scapy,Python,Python 2.7,Scapy,我正在构建的工具中以非交互方式(即作为库)使用scapy 2.3.1-dev。我想获得一组关于数据包的人类可读信息,例如您从scapy.all.packet.show()获得的信息。我尝试过使用所有三种提供信息的方法(packet.show()、packet.show2()和packet.display()),但它们都没有返回任何信息,而是打印出我想要的信息 另外,数据包返回的信息。不够 是否有任何函数/方法会以与诸如packet.show()打印文本相同的方式返回格式良好的文本?如果没有,在将

我正在构建的工具中以非交互方式(即作为库)使用scapy 2.3.1-dev。我想获得一组关于数据包的人类可读信息,例如您从
scapy.all.packet.show()
获得的信息。我尝试过使用所有三种提供信息的方法(
packet.show()
packet.show2()
packet.display()
),但它们都没有返回任何信息,而是打印出我想要的信息

另外,
数据包返回的信息。
不够

是否有任何函数/方法会以与诸如
packet.show()
打印文本相同的方式返回格式良好的文本?如果没有,在将
show()
打印到控制台之前,是否有方法捕获/截取其输出


我知道我可以使用
packet.fields
中的信息来进行自己的字符串格式化,但我正在努力避免这样做

一种可能的方法是将
packet.show()函数的输出重定向到变量
capture
。以下代码提供了一个示例:

import sys
from StringIO import StringIO
from scapy.layers import inet
from scapy.all import *

#Create scapy packet
pack=inet.Ether()/inet.IP()/inet.TCP()

#Redirect output of print to variable 'capture'
capture = StringIO()
save_stdout = sys.stdout
sys.stdout = capture
pack.show()
sys.stdout = save_stdout

#capture.getvalue() is a string with the output of 'pack.show()' 
print capture.getvalue()

#Verify that capture.getvalue() is a string
print isinstance(capture.getvalue(), basestring)
程序的输出为:

###[ Ethernet ]###
  dst       = ff:ff:ff:ff:ff:ff
  src       = 00:00:00:00:00:00
  type      = 0x800
###[ IP ]###
     version   = 4
     ihl       = None
     tos       = 0x0
     len       = None
     id        = 1
     flags     = 
     frag      = 0
     ttl       = 64
     proto     = tcp
     chksum    = None
     src       = 127.0.0.1
     dst       = 127.0.0.1
     \options   \
###[ TCP ]###
        sport     = ftp_data
        dport     = http
        seq       = 0
        ack       = 0
        dataofs   = None
        reserved  = 0
        flags     = S
        window    = 8192
        chksum    = None
        urgptr    = 0
        options   = {}

True
您可以通过
show(dump=True)
使用
show()
方法,然后它会将字符串返回给您。 为什么我知道这一点,因为我读了
show()
方法的代码

以下是代码:

def main():
    packet = scapy.rdpcap('1.pcap')
    for p in packet:
        a = p.show(dump=True)
        print type(a)
        print a
        exit(0)

我希望会有一个更优雅的方式来做这件事,但这会很好。谢谢如果您是多线程的,我建议您在尝试打印程序中任何位置时使用锁。这样,其他文本就不会附加到结果中。谢谢。这节省了我很多工作@康斯坦丁的建议不适合我