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

Mininet中for循环内用threading.Timer定时执行命令报错求助

解决threading.Timer传递变量参数的TypeError问题

看起来你在给threading.Timer传递参数时犯了一个常见的语法错误,我来帮你拆解问题并修复代码:

错误原因分析

你的代码里,字符串格式化操作%(ip, ips[ip])被错误地放在了threading.Timer()实例化语句的末尾,这相当于试图对Timer对象进行字符串格式化,而不是对命令字符串本身做格式化——Timer对象可不是字符串,这自然会触发TypeError。另外,args参数需要传递的是目标函数(这里是attacker.cmd)的参数列表,得确保参数传递的方式正确。

修复后的代码方案

这里提供两种可行的写法,你可以根据需求选择:

方案1:先格式化完整命令字符串再传递

这是最直观的方式,先把包含变量的命令字符串拼接好,再作为单个参数传给attacker.cmd:

import threading

# 假设ips是你的IP字典,比如ips = {"192.168.1.1": 1000, ...}
for ip in ips:
    # 先把命令字符串格式化完成
    cmd_command = f"sudo python SYN-ACK.py {ip} 192.168.1.100 {ips[ip]} 80"
    # 创建定时器,args是包含格式化后命令的元组
    t = threading.Timer(7, attacker.cmd, args=(cmd_command,))
    t.start()  # 一定要启动定时器,否则不会执行!

方案2:拆分参数传递(如果attacker.cmd支持多参数调用)

如果attacker.cmd可以接收多个独立参数(而不是单个完整命令字符串),你可以把每个参数分开传入:

import threading

for ip in ips:
    t = threading.Timer(
        7,
        attacker.cmd,
        args=(
            "sudo python SYN-ACK.py",
            ip,
            "192.168.1.100",
            str(ips[ip]),  # 转换为字符串,确保命令参数格式正确
            "80"
        )
    )
    t.start()

额外提醒

别忘了调用t.start()来启动定时器,否则你的定时任务永远不会被执行。另外,如果你需要循环多次发送命令(而不是每个IP只发一次),可能需要在目标函数里重新创建Timer来实现循环触发,因为threading.Timer是一次性的。

内容的提问来源于stack exchange,提问作者M.salameh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:04:32