Python代码优化:使用ncclient和paramiko连接设备并执行命令

本文介绍使用Python代码优化连接网络设备并执行命令,包括使用ncclient库连接设备,使用paramiko库发送命令,并优化代码结构以提高效率。

原始代码:

from ncclient import manager
import paramiko
import time
import datetime

# 定义设备IP地址、用户名和密码
DEVICE_IP = '10.1.0.6'
USERNAME = 'python'
PASSWORD = 'Huawei@123'


class Device():
    def __init__(self, ip, usr, pwd):
        self.hostname = ip
        self.username = usr
        self.password = pwd
        self.client = self._get_connect()
        self.cli = self.client.invoke_shell()
        self.cli.send('n\n')
        self.cli.send('screen-length 0 temporary\n')

    def _get_connect(self):
        ssh_con = paramiko.SSHClient()
        ssh_con.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh_con.connect(hostname=self.hostname, username=self.username, password=self.password,timeout=10)
        return ssh_con

    def open(self):
        ssh=self._get_connect()
        with open('command.txt', 'r') as f:
            cmd_list = f.readlines()
            for cmd in cmd_list:
                COMMAND=self.cli.send(cmd)
        # 发送命令并获取输出
        stdin, stdout, stderr = self._get_connect().exec_command(COMMAND)
        output = stdout.read().decode('utf-8')

    # 输出结果
        print(output)

    # 将结果写入文件
        timestamp = datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
        filename = f'{DEVICE_IP}_{timestamp}.txt'
        with open(filename, 'w') as f:
            f.write(output)

        ssh.close()

问题分析:

  1. 需要在代码开头导入ncclient
  2. Device类中,cli.send()方法需要传入的是字符串,而不是列表中的元素,所以需要将COMMAND改为cmd
  3. open方法中,不需要再次调用_get_connect()方法获取连接,而是直接使用类属性self.client即可
  4. open方法中,COMMAND变量应该是执行命令后的返回值,而不是cli.send()方法的参数,所以需要将cli.send()方法的返回值赋值给COMMAND
  5. open方法中,应该先将命令逐个发送给设备,再执行exec_command()方法获取输出

修改后的代码:

from ncclient import manager
import paramiko
import time
import datetime

# 定义设备IP地址、用户名和密码
DEVICE_IP = '10.1.0.6'
USERNAME = 'python'
PASSWORD = 'Huawei@123'


class Device():
    def __init__(self, ip, usr, pwd):
        self.hostname = ip
        self.username = usr
        self.password = pwd
        self.client = self._get_connect()
        self.cli = self.client.invoke_shell()
        self.cli.send('n\n')
        self.cli.send('screen-length 0 temporary\n')

    def _get_connect(self):
        ssh_con = paramiko.SSHClient()
        ssh_con.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh_con.connect(hostname=self.hostname, username=self.username, password=self.password,timeout=10)
        return ssh_con

    def open(self):
        with open('command.txt', 'r') as f:
            cmd_list = f.readlines()
            for cmd in cmd_list:
                self.cli.send(cmd)
        time.sleep(1) # 等待命令执行完成
        COMMAND = self.cli.recv(65535).decode('utf-8') # 获取输出

        # 输出结果
        print(COMMAND)

        # 将结果写入文件
        timestamp = datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
        filename = f'{DEVICE_IP}_{timestamp}.txt'
        with open(filename, 'w') as f:
            f.write(COMMAND)

    def close(self):
        self.client.close()


if __name__ == '__main__':
    device = Device(DEVICE_IP, USERNAME, PASSWORD)
    device.open()
    device.close()

代码分析:

  1. 导入ncclient库,用于连接网络设备。
  2. 使用paramiko库建立SSH连接,并获取设备的shell。
  3. 将命令写入command.txt文件,并逐行读取命令发送给设备。
  4. 等待命令执行完成,并使用cli.recv()方法获取设备返回的结果。
  5. 将设备返回的结果输出到控制台,并写入文件。
  6. 最后关闭连接。

注意事项:

  1. 需要确保设备的IP地址、用户名和密码正确。
  2. 需要在设备上配置SSH服务,并允许python用户登录。
  3. 需要确保command.txt文件存在,并且包含要执行的命令。
  4. 可以根据实际需要修改time.sleep()方法中的等待时间。
  5. 可以根据需要修改代码结构,例如使用threading模块实现多线程并发执行命令。

总结:

本文介绍了使用Python代码连接网络设备并执行命令的优化方法。通过使用ncclientparamiko库,并优化代码结构,可以提高代码效率,简化操作流程。

更多学习资料:

希望本文能够帮助您更好地理解使用Python代码连接网络设备并执行命令的知识。

Python代码优化:使用ncclient和paramiko连接设备并执行命令

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

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