Python pyshark with use_json = True не печатает JSON - PullRequest
0 голосов
/ 12 марта 2020

Я использую pyshark и пытаюсь распечатать JSON. Это мой код:

import pyshark
import json

capture = pyshark.LiveCapture(interface='eth0', bpf_filter='http', use_json=True)

for packet in capture.sniff_continuously(packet_count=10):
    print(json.loads(str(packet)))

Но я получаю сообщение об ошибке:

    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Кроме того, при простом запуске print(packet) это не JSON.

ОБНОВЛЕНИЕ

Я пробовал с этим:

cmd = 'tshark -i en0 -f http -T json -x -l --no-duplicate-keys'
args = shlex.split(cmd)
tshark = subprocess.Popen(args, stdout=subprocess.PIPE)
for line in io.TextIOWrapper(tshark.stdout, encoding="utf-8"):
    print("test: %s" % line.rstrip())

Но это распечатывает каждую строку объекта JSON вместо одного объединенного объекта Догадываюсь, это из-за трубы. Можно ли это изменить, чтобы у меня был фактический JSON объект на пакет?

1 Ответ

0 голосов
/ 13 марта 2020

Причина, по которой вы не можете декодировать как JSON, заключается в том, что строка пакета не является JSON:

# print_json.py
import pyshark
import json

capture = pyshark.LiveCapture(interface='en0', use_json=True)
for packet in capture.sniff_continuously(packet_count=1):
     print(packet)

Вывод:

$ python print_json.py
Packet (Length: 78)
Layer ETH:
    dst:
        ig: 0
        eth.dst_resolved: cc:65:ad:da:39:70
        dst_resolved: cc:65:ad:da:39:70
        lg: 0
...

В соответствии с соответствующий файл PyShark , параметр use_ json является экспериментальным:

: параметр use_ json: использует tshark в режиме JSON (ЭКСПЕРИМЕНТАЛЬНО). Это намного быстрее, чем XML

Использование tshark с флагом -T json даст вам json быстрее (и на этом основан use_json).

Использование Tshark напрямую, вместо

Вам следует рассмотреть возможность использования scapy или tshark напрямую. В этом примере мы печатаем слой ethe rnet одного пакета, вызывая tshark с подпроцессом:

# print_eth_json.py
import json
import subprocess as sp
improt pprint

json_str = sp.check_output("tshark -c 2 -T json".split(' ')).decode('utf-8')
tshark_pkts = json.loads(json_str)
# Transform tshark json into a scapy-like packet-json list.
pkts_json = [pkt['_source']['layers'] for pkt in tshark_pkts]
pprint.pprint(pkts_json[0]['eth'])

, а затем запускаем его:

$ python print_eth_json.py
Capturing on 'Wi-Fi: en0'
2
55 packets dropped from Wi-Fi: en0
{'eth.dst': 'cc:65:ad:da:39:70',
 'eth.dst_tree': {'eth.addr': 'cc:65:ad:da:39:70',
                  'eth.addr_resolved': 'ArrisGro_da:39:70',
                  'eth.dst_resolved': 'ArrisGro_da:39:70',
                  'eth.ig': '0',
...
...