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

Python中将动态命令存入动态变量实现多防火墙会话同时登录

问题代码修复方案

现有代码的错误点

  • 用户名密码赋值未加引号,admin和password123属于字符串类型,必须包裹单引号或双引号
  • 变量名混淆:你定义的设备列表变量为appliances,但循环逻辑中使用了未定义的firewallhost变量
  • 字典键访问错误:firewallhost[num][firewall_endpoint]中的firewall_endpoint是字符串类型的键,必须加引号
  • FGT类缺失初始化方法:你没有编写__init__构造方法,传入的ip:port参数没有被接收处理,self.url_prefix、self.session两个属性都未定义
  • 动态变量创建方式不合理:用exec生成动态变量后续调用难度极高,更推荐用列表或字典存储所有会话
  • login方法无返回值:你直接将login的返回值(默认是None)赋值给变量,后续无法拿到FGT实例本身
  • 类型判断写法不规范:type(appliances) == list的写法对继承场景不兼容,更推荐用isinstance(appliances, list)

正确实现代码

方法1:用列表存储所有会话(更推荐,后续遍历调用更方便)

import requests
# 关闭不安全请求的警告提示
requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)

username = "admin"
password = "password123"

# 补全FGT类的初始化逻辑
class FGT(object):
    def __init__(self, endpoint):
        self.endpoint = endpoint
        self.url_prefix = f"https://{endpoint}"
        self.session = requests.Session()
    
    def login(self, name, key):
        url = self.url_prefix + '/logincheck'
        res = self.session.post(url,
                                data=f'username={name}&secretkey={key}',
                                verify=False)
        # 可根据实际接口返回调整登录成功的判断逻辑
        return res.status_code == 200

appliances = [{'firewall': 'Washington', 'firewall_endpoint': '192.168.1.254:443'}, {'firewall': 'Atlanta', 'firewall_endpoint': '10.8.6.1:6565'}]

firewall_sessions = []
if isinstance(appliances, list):
    for item in appliances:
        # 初始化FGT实例
        fgt_session = FGT(item['firewall_endpoint'])
        # 执行登录
        login_result = fgt_session.login(username, password)
        # 存储实例、设备名称、登录状态,方便后续调用
        firewall_sessions.append({
            "name": item['firewall'],
            "endpoint": item['firewall_endpoint'],
            "session": fgt_session,
            "login_success": login_result
        })

# 后续调用示例:遍历所有会话执行操作
for fw in firewall_sessions:
    if fw['login_success']:
        print(f"防火墙{fw['name']}登录成功,可执行后续操作")
        # 自定义的后续操作逻辑可在此处编写

方法2:如果必须生成firewall_endpoint_x_session格式的动态变量

# 前面的用户名定义、FGT类实现和方法1完全一致
if isinstance(appliances, list):
    for num, item in enumerate(appliances):
        fgt_session = FGT(item['firewall_endpoint'])
        fgt_session.login(username, password)
        # 写入全局变量实现动态命名
        globals()[f'firewall_endpoint_{num}_session'] = fgt_session

# 调用示例
print(firewall_endpoint_0_session.endpoint)
print(firewall_endpoint_1_session.endpoint)

内容的提问来源于stack exchange,提问作者CrossingTheRoad2020

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:45:03