DHCP选项Lis中的额外数据

2024-04-19 07:27:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

[('message-type',3),('param_req_-list',b'\x01y\x01\x01\x011\aaa\,'),('max\u dhcp\'u 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)

Tags: fromimportlayersloggingerrorsocketalldhcp
3条回答
#At this point it is not clear to me if this exec is needed.
exec("vals = [('message-type', 3), ('param_req_list', b'\x01y\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')]")

ans = []
for v in vals:
  if v[0] in  ['message-type', 'hostname', 'requested_addr']:
    ans += (v,)

print (ans) 

假设要解析的字符串看起来(并且看起来)像有效的python数据strict,那么可以使用python的内部工具来解析它

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

literal_eval将字符串解析为python数据结构(更安全的是eval)。dict从中构造出方便的字典。在

也许,这不是过滤的最佳解决方案,真的,但它会起作用的。下面的代码将您的列表转换为字典(直接,感谢@Slam提醒)并为字典取一个值。在

>>> x=[('message-type', 3), ('param_req_list', b'\x01y\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')]
>>> y=dict(x)
>>> y['requested_addr']
'192.168.1.4'                                                                                                                                                                                                                   
>>> y['hostname']                                                                                                                                                                                                               
'HOSTNAME'                                                                                                                                                                                                                      
>>>

这段代码一点都不是最优的,但可能会给您一些想法。在

相关问题 更多 >