You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:48:04