Python如何正确将命令行参数传递给函数作为Scapy报文过滤条件
问题修复方案
核心故障原因
argparse模块默认传入的所有参数都是字符串类型,你代码中通过-d传入的端口号实际是字符串"8472",但scapy解析报文拿到的pkt[UDP].dport是整数类型,整数和字符串做相等判断永远返回False,这就是条件匹配失败的核心原因。
另外你代码中还用到了SRCPORT、INNERIP两个全局变量,原硬编码部分注释后没有补充赋值逻辑,后续匹配成功后也会触发变量未定义报错。
具体修改步骤
1. 调整参数解析逻辑,指定参数类型
给端口类参数加上type=int声明,确保拿到的是整数类型,同时补全所有用到的全局变量的参数配置,也可以设置默认值避免不传参数时报错:
if __name__ == '__main__': # 声明所有用到的全局变量 global UDPPORT, DSTHOST, SRCPORT, INNERIP parser = argparse.ArgumentParser() # 指定Dport类型为整数 parser.add_argument("-d", "--Dport", type=int, default=8472) parser.add_argument("-o", "--OuterIP", default="172.18.0.1") # 补全缺失变量的参数配置 parser.add_argument("-s", "--SrcPort", type=int, default=55555) parser.add_argument("-i", "--InnerIP", default="10.1.5.1") args = parser.parse_args() UDPPORT = args.Dport DSTHOST = args.OuterIP SRCPORT = args.SrcPort INNERIP = args.InnerIP print("Scapy vxlan responder") scapy.all.conf.iface = "br-22b28ede79c2" sniff(filter=("port %s") % (UDPPORT), prn=dispatcher_callback)
2. 可选优化:优化报文层读取逻辑
原代码中通过多层.payload取内层报文的方式非常容易出错,建议直接用scapy的层名读取,比如直接用pkt[VXLAN]、pkt[VXLAN].payload拿内层报文,稳定性更高。
修改后重新运行脚本即可正常匹配报文条件。
内容的提问来源于stack exchange,提问作者99Linux
相关产品推荐
相关产品推荐

