Python代码优化:使用ncclient和paramiko连接设备并执行命令
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()
问题分析:
- 需要在代码开头导入
ncclient库 - 在
Device类中,cli.send()方法需要传入的是字符串,而不是列表中的元素,所以需要将COMMAND改为cmd - 在
open方法中,不需要再次调用_get_connect()方法获取连接,而是直接使用类属性self.client即可 - 在
open方法中,COMMAND变量应该是执行命令后的返回值,而不是cli.send()方法的参数,所以需要将cli.send()方法的返回值赋值给COMMAND - 在
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()
代码分析:
- 导入
ncclient库,用于连接网络设备。 - 使用
paramiko库建立SSH连接,并获取设备的shell。 - 将命令写入
command.txt文件,并逐行读取命令发送给设备。 - 等待命令执行完成,并使用
cli.recv()方法获取设备返回的结果。 - 将设备返回的结果输出到控制台,并写入文件。
- 最后关闭连接。
注意事项:
- 需要确保设备的IP地址、用户名和密码正确。
- 需要在设备上配置SSH服务,并允许
python用户登录。 - 需要确保
command.txt文件存在,并且包含要执行的命令。 - 可以根据实际需要修改
time.sleep()方法中的等待时间。 - 可以根据需要修改代码结构,例如使用
threading模块实现多线程并发执行命令。
总结:
本文介绍了使用Python代码连接网络设备并执行命令的优化方法。通过使用ncclient和paramiko库,并优化代码结构,可以提高代码效率,简化操作流程。
更多学习资料:
希望本文能够帮助您更好地理解使用Python代码连接网络设备并执行命令的知识。
原文地址: https://www.cveoy.top/t/topic/n4eD 著作权归作者所有。请勿转载和采集!