2015-04-12 5 views
3

Файл PCAP загружается из URL с помощью Python (2.7.9) просит библиотека:Работа с Python просит ответа необработанный файл типа (файл PCAP процесса без сохранения его на диск) объект

import requests 
response = requests.get('http://example.com/path/1.pcap', stream=True) 

Согласно документации response.raw является файлоподобным объектом, и моя цель - обработать загруженный файл, не сохраняя его на диске.

я впервые посмотрел на Scapy и Pyshark библиотек для .pcap файла синтаксического анализа, но их функции (rdpcap и FileCapture) принимает путь к файлу в качестве аргумента строку. pcap.Reader от dpkt библиотека принимает файл. Первая попытка pcap=dpkt.pcap.Reader(resonse.raw) дала ошибку:

AttributeError: 'HTTPResponse' object has no attribute 'name' 

атрибут Name был добавлен:

setattr(response.raw,'name', 'test.pcap') 

После этого pcap=dpkt.pcap.Reader(resonse.raw) не давал каких-либо ошибок, но pcap.readpkts() неудачу с

io.UsupportedOperation: seek 

И действительно response.raw.seekable() возвращается False.

Я попытался установить response.raw.decode_content = True, но это не помогло.

Есть ли решение для обработки объекта так, как я пытаюсь? Возможно, требуются дополнительные параметры запроса, чтобы получить объект ответа на поиск?

Кстати, если объект ответа записывается в файл (shutil.copyfileobj(response.raw,file)), то dpkt успешно работает с этим файлом.

+0

Можете ли вы показать фрагмент кода, который терпит неудачу, @ Andrey? – boardrider

ответ

2

Поддержка объектов StringIO была недавно добавлена ​​к dpkt. Итак, теперь вы можете создать объект StringIO из вашей строки, а затем передать в pcap.Reader

Чтобы создать объект StringIO из строки:

from StringIO import StringIO 
data = StringIO("aaaaa..aa") 

Вы можете сделать

import dpkt 
from StringIO import StringIO 
import requests 

response = requests.get('http://example.com/path/1.pcap', stream=True) 
data = StringIO(response.raw) 
pcap = dpkt.pcap.Reader(data) 
    for ts, buf in pcap: 
     eth = dpkt.ethernet.Ethernet(buf) 
     ... 
+1

Вы должны упомянуть, что способ сделать это - «из StringIO импортировать StringIO # (или cStringIO)», а затем обернуть строку «wrapped_string = StringIO» («моя строка здесь») ' –

+0

спасибо за предложение. обновил ответ сейчас –

+0

Киран, спасибо. Я надеюсь, что этот метод будет работать, но я еще не смог его проверить. После обновления DPKT он не работает с 'из test import pystone' с ошибкой' невозможно импортировать имя pystone'. Я установил пакет 'test' из pip, но он не содержит' pystone'. Не удалось это решить (я использую Python 2.7 на Ubuntu 12.04). –