从DHCP选项列表中提取数据

时间:2017-06-20 17:53:24

标签: python scapy dhcp

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

[('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')]

我只想要打印消息类型,主机名和请求的地址。我从哪里开始将它转换为元组,所以我可以过滤掉元素?

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

sslmode = require

3 个答案:

答案 0 :(得分:1)

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

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

literal_eval将字符串解析为python数据结构(并且它更安全eval)。 dict从中构建方便的字典。

答案 1 :(得分:0)

#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) 

答案 2 :(得分:0)

也许,它不是过滤的最佳解决方案,但它确实有效。下面的代码将您的列表转换为字典(直接,感谢@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'                                                                                                                                                                                                                      
>>>

这段代码根本不是最优的,但可能会给你一些想法。