4

借助 Python (2.7.9) Requests 库从 url 下载 pcap 文件:

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

根据文档response.raw是一个类似文件的对象,我的目标是处理下载的文件而不将其保存到磁盘。

我首先查看了用于文件解析的库,但它们的函数 (ScapyPyshark)接受文件路径字符串作为参数。from library 接受一个文件对象。第一次尝试报错:.pcaprdpcapFileCapturepcap.Readerdpktpcap=dpkt.pcap.Reader(resonse.raw)

AttributeError: 'HTTPResponse' object has no attribute '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之后会成功使用该文件。

4

1 回答 1

1

dpkt 最近添加了对 StringIO 对象的支持。所以,现在您可以从您的字符串创建一个 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)
        ...
于 2015-06-18T00:49:09.457 回答