Python:通过管道将 pcap 文件传输到 stdout 时出错
Python: piping pcap file to stdout gives error
我正在尝试将 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.
您是否尝试过升级 PyPcap 以在 Python 3 上工作?这可能会有所帮助,因为在 Python 上 Unicode 处理更加简洁并且不太容易出现意外 3. 至少在 Debian(可能还有衍生发行版)上有合适的软件包可用。寻找:python3-pypcap.
错误消息已经告诉您发生了什么。您需要 pcap()
函数的字符串,而不是文件对象。要解决此问题,请尝试
pcap.pcap(io.open(STDIN_ALIAS, 'r').read())
但我不确定这是否有效,因为您的文件可能是二进制文件而不是文本文件。在这种情况下,您可能希望使用 'rb'
而不是 'r'
标志打开,然后进行一些转换(特别是如果您使用 Python 3 而不是 Python 2.7)。
我看到另一个问题:您的代码不可移植,因为它取决于此:
STDIN_ALIAS = '/proc/self/fd/0'
读取标准输入的 pythonic 方式如下(参见 Reading binary data from stdin)
import sys
string = sys.stdin.read()
您不能使用 Python 将数据包从文件传递到 pcap.pcap()
。 pypcap
library you are using is a thin wrapper around the pcap_open_offline()
and pcap_create()
C 函数,不提供传递 Python 文件对象的功能。此包装器 仅 接受文件名或网络接口名称,没有别的。
pcap_open_offline()
函数确实接受 -
作为 stdin
的别名,因此直接将其传递:
import pcap
sniffer = pcap.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.
您是否尝试过升级 PyPcap 以在 Python 3 上工作?这可能会有所帮助,因为在 Python 上 Unicode 处理更加简洁并且不太容易出现意外 3. 至少在 Debian(可能还有衍生发行版)上有合适的软件包可用。寻找:python3-pypcap.
错误消息已经告诉您发生了什么。您需要 pcap()
函数的字符串,而不是文件对象。要解决此问题,请尝试
pcap.pcap(io.open(STDIN_ALIAS, 'r').read())
但我不确定这是否有效,因为您的文件可能是二进制文件而不是文本文件。在这种情况下,您可能希望使用 'rb'
而不是 'r'
标志打开,然后进行一些转换(特别是如果您使用 Python 3 而不是 Python 2.7)。
我看到另一个问题:您的代码不可移植,因为它取决于此:
STDIN_ALIAS = '/proc/self/fd/0'
读取标准输入的 pythonic 方式如下(参见 Reading binary data from stdin)
import sys
string = sys.stdin.read()
您不能使用 Python 将数据包从文件传递到 pcap.pcap()
。 pypcap
library you are using is a thin wrapper around the pcap_open_offline()
and pcap_create()
C 函数,不提供传递 Python 文件对象的功能。此包装器 仅 接受文件名或网络接口名称,没有别的。
pcap_open_offline()
函数确实接受 -
作为 stdin
的别名,因此直接将其传递:
import pcap
sniffer = pcap.pcap('-')