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
相关产品推荐
相关产品推荐

