我正在使用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
。
UPDATE
我已经尝试过:
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
对象吗?
# 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
...
[relevant PyShark file,参数use_json是实验性的:
:param use_json:在JSON模式下使用tshark(EXPERIMENTAL)。比XML快很多]
将tshark与-T json
标志一起使用将为您提供更快的json(并且use_json
的基础)。直接使用Tshark
您应该考虑直接使用scapy或tshark。在此示例中,我们通过使用子进程调用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',
...