Непрерывное прослушивание и одновременное сохранение файлов PCAP с использованием метода PyShark LiveCapture с display_filter

Я пытаюсь постоянно перехватывать пакеты и одновременно сохранять их в файл PCAP, используя метод LiveCapture PyShark с параметром display_filter. Я пытаюсь воспроизвести функцию Wireshark, где вы можете остановить и сохранить захват в любой момент с любым указанным фильтром. Эта настройка в Python будет включать неопределенный тайм-аут и отсутствие ограничений на количество пакетов, что позволит прерыванию процесса (например, прерыванию клавиатуры) остановить процесс. Вот пример с try/catch, где я могу без проблем распечатать пакеты:

import pyshark

interf = "Wi-Fi"
capture = pyshark.LiveCapture(interface=interf, display_filter='tcp')

try:
    for packet in capture.sniff_continuously():
        print(packet)
except KeyboardInterrupt:
    print("Capture stopped.")

И теперь после добавления параметра для выходного_файла ничего не происходит:

import pyshark

interf = "Wi-Fi"
capture = pyshark.LiveCapture(interface=interf, display_filter='tcp', output_file = "HERE.pcap")

try:
    for packet in capture.sniff_continuously():
        print(packet)
except KeyboardInterrupt:
    print("Capture stopped.")

Сейчас использую pyshark==0.6

Второй раздел кода работает? Я получаю эту ошибку: `tshark: фильтры отображения не поддерживаются при захвате и сохранении захваченных пакетов.`

Life is complex 25.06.2024 16:08

Вы запускаете свой код в IDE или через терминал?

Life is complex 25.06.2024 16:09

Я использую терминал для запуска. Я обновил свой вопрос, используя имеющуюся у меня версию pyshark, и не получаю никаких ошибок. При дальнейшем исследовании выяснилось, что display_filter на самом деле не фильтрует то, что собирается; вместо этого он просто скрывает несовпадающие пакеты. Скорее всего, вместо этого мне придется использовать BPF.

kyrlon 25.06.2024 16:40
PyShark выйдет из Терминала с помощью CTRL + C, но выход не будет чистым. TShark выдаст ошибки TsharkXmlParser.get_packets_from_stream()
Life is complex 25.06.2024 17:29

@Lifeiscomplex, какую версию pyshark вы используете?

kyrlon 25.06.2024 22:33

То же, что и вы на Mac. Я использую Python 3.10x

Life is complex 25.06.2024 22:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш последний код потерпит неудачу, потому что display_filter нельзя использовать при использовании output_file.

import pyshark

network_interface = 'en0'
capture = pyshark.LiveCapture(interface=network_interface, display_filter='tcp', output_file = "HERE.pcap")

try:
    for packet in capture.sniff_continuously():
        print(packet)
except KeyboardInterrupt:
    print("Capture stopped.")

Вот дубляж:

2024-07-08 11:38:26,984 - LiveCapture - DEBUG - Creating Dumpcap subprocess with parameters: /usr/local/bin/dumpcap -q -i en0 -w -
2024-07-08 11:38:26,987 - LiveCapture - DEBUG - Dumpcap subprocess (pid 75408) created
2024-07-08 11:38:27,262 - LiveCapture - DEBUG - Creating TShark subprocess with parameters: /usr/local/bin/tshark -l -n -T pdml -Y tcp -w HERE.pcap -i -
2024-07-08 11:38:27,262 - LiveCapture - DEBUG - Executable: /usr/local/bin/tshark
2024-07-08 11:38:27,264 - LiveCapture - DEBUG - Capturing on 'Wi-Fi: en0'
2024-07-08 11:38:27,264 - LiveCapture - DEBUG - File: -
2024-07-08 11:38:27,264 - LiveCapture - DEBUG - TShark subprocess (pid 75422) created
2024-07-08 11:38:27,542 - LiveCapture - DEBUG - tshark: Display filters aren't supported when capturing and saving the captured packets.
2024-07-08 11:38:27,546 - LiveCapture - DEBUG - EOF reached (sync)
2024-07-08 11:38:27,546 - LiveCapture - DEBUG - Cleanup Subprocess (pid 75422)

Вам нужно использовать bpf_filter

import pyshark

network_interface = 'en0'
capture = pyshark.LiveCapture(interface=network_interface, bpf_filter='tcp', output_file = "HERE.pcap")

try:
    for packet in capture:
        print(packet)
except KeyboardInterrupt:
    print("Capture stopped.")

Вот дубляж:

2024-07-08 11:44:30,023 - LiveCapture - DEBUG - Creating Dumpcap subprocess with parameters: /usr/local/bin/dumpcap -q -f tcp -i en0 -w -
2024-07-08 11:44:30,026 - LiveCapture - DEBUG - Dumpcap subprocess (pid 75542) created
2024-07-08 11:44:30,324 - LiveCapture - DEBUG - Creating TShark subprocess with parameters: /usr/local/bin/tshark -l -n -T pdml -w HERE.pcap -i -
2024-07-08 11:44:30,324 - LiveCapture - DEBUG - Executable: /usr/local/bin/tshark
2024-07-08 11:44:30,327 - LiveCapture - DEBUG - Capturing on 'Wi-Fi: en0'
2024-07-08 11:44:30,327 - LiveCapture - DEBUG - File: -
2024-07-08 11:44:30,327 - LiveCapture - DEBUG - TShark subprocess (pid 75556) created
2024-07-08 11:44:30,630 - LiveCapture - DEBUG - Capturing on '-'

Остановить PyShark чисто, как Wireshark, невозможно с текущей базой кода, потому что TShark приведет к сбою.

Capture stopped.
Task exception was never retrieved
future: <Task finished name='Task-59' coro=<TsharkXmlParser.get_packets_from_stream() done, defined at /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pyshark/tshark/output_parser/tshark_xml.py:24> exception=EOFError()>
Traceback (most recent call last):
  File "/Users/username/Python_Projects/packet_analysis/test_keyboard.py", line 7, in <module>
    for packet in capture.sniff_continuously():
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pyshark/capture/capture.py", line 221, in _packets_from_tshark_sync
    packet, data = self.eventloop.run_until_complete(
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/asyncio/base_events.py", line 636, in run_until_complete
    self.run_forever()
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/asyncio/base_events.py", line 603, in run_forever
    self._run_once()
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/asyncio/base_events.py", line 1871, in _run_once
    event_list = self._selector.select(timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/selectors.py", line 562, in select
    kev_list = self._selector.control(None, max_ev, timeout)
KeyboardInterrupt

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pyshark/tshark/output_parser/tshark_xml.py", line 27, in get_packets_from_stream
    return await super().get_packets_from_stream(stream, existing_data, got_first_packet=got_first_packet)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pyshark/tshark/output_parser/base_parser.py", line 22, in get_packets_from_stream
    raise EOFError()
EOFError
2024-07-08 11:46:30,653 - LiveCapture - DEBUG - Cleanup Subprocess (pid 75701)
2024-07-08 11:46:30,653 - LiveCapture - DEBUG - Cleanup Subprocess (pid 75687)

По этому вопросу на PyShark было открыто 2 выпуска:

https://github.com/KimiNewt/pyshark/issues/367

https://github.com/KimiNewt/pyshark/issues/390

Неясно, была ли проблема решена или проблема зависит только от ОС.

Спасибо за эту деталь! Как вы уже говорили выше, вы не можете одновременно запускать display_filter и захватывать, но использование bpf_filter — лучшая альтернатива этому.

kyrlon 09.07.2024 05:17

Другие вопросы по теме