Python:将pcap文件传送到stdout会出错

时间:2018-12-31 09:30:17

标签: python pipe stdout pcap

我正在尝试将xz的输出传递给自定义python脚本:

xz -cd file.pcap.xz | myscripy.py

但是,当脚本尝试运行此行时出现错误:

  #!/usr/bin/env python2.7
from __future__ import print_function

import pcap
import io
STDIN_ALIAS = '/proc/self/fd/0' 

pcap.pcap(io.open(STDIN_ALIAS, 'r'))

并收到错误

    pcap.pcap(io.open(STDIN_ALIAS, 'r'))
  File "pcap.pyx", line 196, in pcap.pcap.__init__
TypeError: expected string or Unicode object, _io.TextIOWrapper found

我在Ubuntu 18.04上并在python 2.7下运行。

3 个答案:

答案 0 :(得分:3)

您不能使用Python将数据包从文件传递到pcap.pcap()。您使用的pypcap librarypcap_open_offline()pcap_create() C函数的一个瘦包装器,并且不提供传递Python文件对象的功能。此包装器仅接受文件名或网络接口名称,

pcap_open_offline()函数确实接受-作为stdin的别名,因此只需直接将其传递进来即可:

import pcap

sniffer = pcap.pcap('-')

答案 1 :(得分:0)

该错误消息已经告诉您发生了什么。您需要pcap()函数的字符串,而不是文件对象。要解决此问题,请尝试

pcap.pcap(io.open(STDIN_ALIAS, 'r').read())

但是我不确定这是否可以工作,因为您的文件可能是二进制文件而不是文本文件。在这种情况下,您可能希望使用'rb'而不是'r'标志打开,然后进行一些转换(尤其是如果您使用Python 3而不是Python 2.7)。

我看到另一个问题:您的代码不可移植,因为它取决于此:

STDIN_ALIAS = '/proc/self/fd/0' 

以下是读取stdin的Python方法(请参见Reading binary data from stdin

import sys
string = sys.stdin.read()

答案 2 :(得分:-1)

您是否尝试过升级PyPcap以在Python 3上运行?这可能会有所帮助,因为Unicode处理更加简洁,并且在Python 3上不太容易出乎意料。至少在Debian(可能还包括发行版)上可以使用适当的软件包。寻找:python3-pypcap。