1. 在代码中缺少导入os模块的语句,需要添加 import os。
  2. 在代码中使用了相对路径打开文件,但是当前工作目录不确定,可能会导致找不到文件的错误,需要使用绝对路径或者确保当前工作目录正确。
  3. 在执行命令时,需要将命令的输出结果进行错误处理,否则可能会导致程序崩溃。可以使用 try-except 来处理可能出现的异常。
  4. 在代码中的命令执行过程中,每次都需要连接和断开SSH连接,这样会影响程序的效率。可以将连接和断开SSH连接的方法放到类的初始化和销毁方法中,避免每次执行命令时都进行连接和断开操作。
  5. 在代码中使用了硬编码的方式指定Netconf的配置,这样不够灵活,应该将配置参数作为参数传入类的初始化方法中,以便根据需要进行修改。
  6. 在代码中,使用了全局变量作为参数,不够规范,建议将这些参数作为类的属性,并在初始化方法中进行赋值。
  7. 在代码中,如果命令文件不存在,会打印错误信息并返回,建议抛出异常,让调用者来处理异常。同时,可以在初始化方法中进行文件存在性检查。
  8. 在代码中,如果命令文件中有空行,也会执行空命令,建议在执行命令之前先去除空行。
  9. 在代码中,执行命令时没有对命令的输出进行分析和处理,建议对输出进行解析,提取需要的信息并返回,以便调用者进行后续处理。

优化后的代码如下:

import os import paramiko

class HuaweiDevice(): # 初始化华为设备类,需要传入设备的IP地址、用户名、密码、Netconf配置和命令文件路径 def init(self, ip, username, password, netconf_config, commands_file): self.ip = ip self.username = username self.password = password self.netconf_config = netconf_config self.commands_file = commands_file self.ssh = None # SSH连接对象

    # 检查命令文件是否存在
    if not os.path.exists(self.commands_file):
        raise FileNotFoundError(f'命令文件 {self.commands_file} 不存在,请检查!')

# SSH连接方法
def connect_ssh(self):
    self.ssh = paramiko.SSHClient() # 创建SSH客户端对象
    self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 自动添加新主机的密钥
    self.ssh.connect(self.ip, username=self.username, password=self.password) # SSH连接

# SSH断开连接方法
def disconnect_ssh(self):
    if self.ssh: # 如果已经连接,则关闭连接
        self.ssh.close()
        self.ssh = None

# 启用Netconf方法
def enable_netconf(self):
    if not self.ssh: # 如果未连接,则先连接
        self.connect_ssh()
    # 发送命令,启动Netconf功能
    stdin, stdout, stderr = self.ssh.exec_command(self.netconf_config)
    # 输出命令的执行结果
    print(stdout.read().decode())
    self.disconnect_ssh()

# 执行命令方法
def execute_commands(self):
    if not self.ssh: # 如果未连接,则先连接
        self.connect_ssh()

    output = ''
    with open(self.commands_file, 'r') as f:
        for line in f:
            command = line.strip()
            if command: # 如果命令非空
                stdin, stdout, stderr = self.ssh.exec_command(command)
                # 处理命令的输出
                try:
                    output += f'执行命令:{command}\n{stdout.read().decode()}\n{stderr.read().decode()}\n'
                except Exception as e:
                    output += f'执行命令:{command}\n{str(e)}\n'

    self.disconnect_ssh()
    return output

if name == 'main': # 设备的IP地址、用户名和密码 Dev_ip = '10.1.0.6' Dev_usr = 'python' Dev_pwd = 'Huawei@123' Net_usr = 'ncclient' Net_pwd = 'Huawei@123' netconf_config = 'system-view\nnetconf\nprotocol inbound ssh port 830\ncommit\nquit\n' commands_file = '/path/to/command.txt'

device = HuaweiDevice(ip=Dev_ip, username=Dev_usr, password=Dev_pwd, netconf_config=netconf_config, commands_file=commands_file)
device.enable_netconf()
output = device.execute_commands()
print(output
对下面的代码排错并优化import paramiko# 设备的IP地址、用户名和密码Dev_ip = 10106Dev_usr = pythonDev_pwd = Huawei123Net_usr = ncclientNet_pwd = Huawei123netconf = system-viewnnetconfnprotocol inbound ssh port 830ncommitnquitn

原文地址: https://www.cveoy.top/t/topic/hcKS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录