【发布时间】:2017-12-04 20:19:10
【问题描述】:
我对@987654321@ 完全陌生,我正在尝试使用它为我的局域网构建一个 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 或其他方式。
访问这些选项的适当方式是什么?
【问题讨论】:
-
我很好奇你是否能得到有用的答案。我不能说 scapy 做的事情比你现在做的更“有条理”。问题是 DHCP 只是将选项列表抛出到 bootp 有效负载中。不需要特定的选项,也不需要特定的订购。可能有多个相同类型的选项(路由器、DNS 服务器等),因此没有明显的 dict 类型框架有效。拥有多个消息类型并通常会成为第一个消息类型并没有什么意义,但没有人说它必须是。
标签: python network-programming scapy dhcp