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

标签 python network-programming scapy dhcp

我完全不熟悉 scapy ,我正在尝试使用它为我的 LAN 构建 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 层访问 options 的方式有点笨拙,但这是我想出的唯一可行的方式。然而,我相信一定有更好、更 pythonic 的方式,比如通过 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 来访问选项。

关于python - Scapy:检查捕获的 DHCP 数据包的消息类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47641318/

相关文章:

c - 如何在C中通过系统调用配置accept_local

python - 无法导入图层 xxx : name arp_display is not defined Python

Python:通过字符串中的名称访问结构字段

python - 链接桶的最佳组合

python - 如何在执行 subprocess.Popen 时保留外壳上输出的原始颜色编码?

windows - WinAPI:InternetCloseHandle 函数关闭句柄但不关闭连接

c - net_ntoa、struct sockaddr_in 和指针转换

python - 关于 Scapy 中 IPv6 地址的问题

python - 字典更新序列元素#0的长度为3; 2 是必需的

python - 提高数组操作的性能