nik*_*nik 4 python scapy python-2.7
我在我正在构建的工具中非交互式地使用scapy 2.3.1-dev(即作为库).我想获得一些关于数据包的人类可读信息,例如你从中得到的信息scapy.all.Packet.show().我已经尝试使用提供信息的所有三种方法(packet.show(),packet.show2()和packet.display()),但这些方法都没有返回任何内容,而是打印出我想要的信息.
此外,返回的信息还packet.__repr__()不够.
是否有任何函数/方法可以像packet.show()打印它们一样返回格式良好的文本?如果没有,有什么方法show()可以在打印到控制台之前捕获/拦截输出?
我知道我可以使用来自的信息进行自己的字符串格式化packet.fields,但我试图避免必须这样做.
小智 7
你可以使用show()方法show(dump=True),然后它将返回给你的字符串.为什么我知道,因为我读了show()方法的代码.
这是代码:
def main():
packet = scapy.rdpcap('1.pcap')
for p in packet:
a = p.show(dump=True)
print type(a)
print a
exit(0)
Run Code Online (Sandbox Code Playgroud)
其中一种可能的方法是将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)
Run Code Online (Sandbox Code Playgroud)
该计划的产出是:
###[ 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7867 次 |
| 最近记录: |