从scapy数据包获取信息字符串
问题内容:
我在构建的工具中非交互地使用scapy
2.3.1-dev(即作为库)。我想获取一串关于数据包的人类可读信息,例如您从中获得的信息scapy.all.Packet.show()
。我一直在使用这三种方法试过(packet.show()
,packet.show2()
和packet.display()
)提供的信息,但这些什么回报,而不是他们打印出我想要的信息。
而且,返回的信息还packet.__repr__()
不够。
是否有任何函数/方法可以像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