Я пытаюсь постоянно перехватывать пакеты и одновременно сохранять их в файл 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
Вы запускаете свой код в IDE или через терминал?
Я использую терминал для запуска. Я обновил свой вопрос, используя имеющуюся у меня версию pyshark
, и не получаю никаких ошибок. При дальнейшем исследовании выяснилось, что display_filter на самом деле не фильтрует то, что собирается; вместо этого он просто скрывает несовпадающие пакеты. Скорее всего, вместо этого мне придется использовать BPF.
PyShark
выйдет из Терминала с помощью CTRL + C, но выход не будет чистым. TShark
выдаст ошибки TsharkXmlParser.get_packets_from_stream()
@Lifeiscomplex, какую версию pyshark вы используете?
То же, что и вы на Mac. Я использую Python 3.10x
Ваш последний код потерпит неудачу, потому что 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 выпуска:
Неясно, была ли проблема решена или проблема зависит только от ОС.
Спасибо за эту деталь! Как вы уже говорили выше, вы не можете одновременно запускать display_filter
и захватывать, но использование bpf_filter
— лучшая альтернатива этому.
Второй раздел кода работает? Я получаю эту ошибку: `tshark: фильтры отображения не поддерживаются при захвате и сохранении захваченных пакетов.`