Python Scapy:检查捕获的DHCP数据包的消息类型

Python Scapy:检查捕获的DHCP数据包的消息类型,python,network-programming,scapy,dhcp,Python,Network Programming,Scapy,Dhcp,我是个新手,我正试图用它为我的局域网建立一个DHCP监视器。我使用sniff捕获通过prn=参数发送到回调的数据包。在回调内部,我检查数据包是否具有DHCP层,然后检查请求的类型 我现在是这样做的: def manage(pkt): if pkt.haslayer(DHCP): req_type = [x[1] for x in pkt[DHCP].options if x[0] == 'message-type'][0] # Message type:

我是个新手,我正试图用它为我的局域网建立一个DHCP监视器。我使用
sniff
捕获通过
prn=
参数发送到回调的数据包。在回调内部,我检查数据包是否具有
DHCP
层,然后检查请求的类型

我现在是这样做的:

def manage(pkt):
    if pkt.haslayer(DHCP):
        req_type = [x[1] for x in pkt[DHCP].options if x[0] == 'message-type'][0]

        # Message type: request
        if req_type == 3:
            print ("Request from {}".format(pkt[Ether].src))

sniff(prn=manage, count=0, store=0)
我在DHCP层中访问
选项的方式有点笨拙,但这是我想到的唯一有效的方法。然而,我相信一定有一种更好的、更具python风格的方式,比如通过
dict
或其他方式


访问这些选项的合适方式是什么?

我认为这几乎是做你想做的事情最有效的方式。我将使用
next()
和生成器表达式而不是列表,以避免在不必要时解析整个选项列表:

req_type = next(opt[1] for opt in pkt[DHCP].options if isinstance(opt, tuple) and opt[0] == 'message-type')
注意,我还添加了对
opt
类型的检查,因为有些是字符串对象

您可以使用一个
dict()
,但是您必须再次解析整个选项列表


作为旁注,Scapy中处理DHCP选项的方法有点陈旧,现在正确的方法可能是使用
PacketListField
和更干净的方法来访问选项。

我很好奇您是否能得到有用的答案。我看不出scapy做的事情比你现在做的更“有条理”。问题是DHCP只是将选项列表抛出到bootp负载中。不需要特定的选项,也不需要特定的订购。同一类型的多个选项(路由器、DNS服务器等)是可能的,因此没有明显的dict类型框架可以工作。不止一种消息类型是没有意义的,这通常是第一种消息类型,但没有什么规定必须是第一种消息类型。巧妙地使用
next
,很好。那我就解决了。