我正在编写一个Python脚本,该脚本从DHCP数据包中提取数据。目前,我输出的一部分只是来自DHCP Options的列表:

[('消息类型',3),('param_req_list',b'\ x01y \ x01 \ x01 \ x01 \ x011 \ aaa_ ,.'),('max_dhcp_size',1500),('client_id',b'\ x01 (\ aaa \ aa1A \ aa1O'),('requested_addr','192.168.1.4'),('server_id','192.168.1.1'),('hostname',b'HOSTNAME')]

我只希望打印消息类型,主机名和请求的地址。从哪里开始将其转换为元组,以便可以过滤出元素?

编辑:
我的输出在上面。
我的代码是:

from scapy.all import *
from scapy.layers import dhcp
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
runtime = logging.getLogger('scapy.runtime')
runtime.setLevel(logging.ERROR)
loading = logging.getLogger('scapy.loading')
loading.setLevel(logging.ERROR)
from scapy.layers.l2 import Ether
from scapy.layers.all import BOOTP
from scapy.layers.all import DHCP, DHCPTypes, DHCPOptions, DHCPRevOptions
from scapy import route

s=socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0800))

print("Input network interface")
interface = input()


def pkt_data(pkt):
    src_mac = pkt.getlayer(Ether).fields['src']
    dhcp_options = filter(lambda o: type(o) is tuple,
        pkt.getlayer(DHCP).fields['options'])


    print(src_mac)
    print(list(dhcp_options))

sniff(iface=interface, prn=pkt_data, filter='udp port (67 or 68)',  store=0)

最佳答案

假设您要解析的字符串看起来(并且看上去)像是严格的有效python数据,则可以使用python的内部工具对其进行解析

from ast import literal_eval
lst = literal_eval(msg)
data = dict(lst)
...


literal_eval将字符串解析为python数据结构(及其更安全的eval)。 dict以此构建便捷的字典。

关于python - 从DHCP选项列表中提取数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44659939/

10-12 21:42