Obtener información de cadena de paquete de Scapy

Estoy utilizando scapy 2.3.1-dev de forma no interactiva (es decir, como una biblioteca) en una herramienta que estoy creando. Me gustaría obtener una cadena de información legible para los humanos acerca de un paquete, como la que recibe de scapy.all.Packet.show() . He intentado usar los tres métodos ( packet.show() , packet.show2() y packet.display() ) que proporcionan la información, pero ninguno de estos devuelve nada, en su lugar imprimen la información que deseo.

Además, la información devuelta por el packet.__repr__() no es suficiente.

¿Hay alguna función / método que devuelva el texto bien formateado de la misma manera que, por ejemplo, packet.show() imprime? Si no es así, ¿hay alguna manera de capturar / interceptar la salida de show() , antes de que se imprima en la consola?

Soy consciente de que puedo hacer mi propio formato de cadena, utilizando la información de packet.fields , pero estoy tratando de evitar tener que hacerlo.

Una de las formas posibles es redirigir la salida de la función packet.show() a la capture variables. El siguiente código proporciona un ejemplo:

 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) 

La salida del progtwig es:

 ###[ 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 

Puede usar el método show() por show(dump=True) , luego le devolverá la cadena. ¿Por qué lo sé, porque leí el código del método show() ?

Aquí está el código:

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