Python: передача файла pcap в stdout дает ошибку - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь перенаправить вывод 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 голосов
/ 02 января 2019

В сообщении об ошибке уже сообщается, что произошло.Вам нужна строка для функции pcap(), а не объект файла.Чтобы это исправить, попробуйте

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

Но я не уверен, что это сработает, поскольку ваш файл может быть двоичным, а не текстовым.В таком случае вам может потребоваться открыть с 'rb' вместо 'r' flag и впоследствии выполнить некоторое преобразование (особенно если вы используете Python 3 вместо Python 2.7).

Я вижу еще одну проблему: вашкод не является переносимым, так как зависит от этого:

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

Питонный способ чтения стандартного ввода данных заключается в следующем (см. Чтение двоичных данных из стандартного ввода )

import sys
string = sys.stdin.read()
0 голосов
/ 03 января 2019

Вы не можете использовать Python для передачи пакетов из файла в pcap.pcap().Библиотека pypcap , которую вы используете, является тонкой оболочкой для функций pcap_open_offline() и pcap_create() C и не предлагает никаких средств для передачи вФайловый объект Python.Эта оболочка only принимает имя файла или имя сетевого интерфейса, больше ничего.

Функция pcap_open_offline() принимает - в качестве псевдонима для stdin, поэтому просто передайте его внапрямую:

import pcap

sniffer = pcap.pcap('-')
0 голосов
/ 02 января 2019

Вы пытались обновить PyPcap для работы на Python 3?Это может помочь, поскольку обработка Unicode намного чище и менее подвержена неожиданностям в Python 3. Соответствующий пакет доступен, по крайней мере, в Debian (и, вероятно, также в производных дистрибутивах).Ищите: python3-pypcap.

...