对下面的代码排错并优化import paramikoimport time# 设备的IP地址、用户名和密码Dev_ip = 10106Dev_usr = pythonDev_pwd = Huawei123Net_usr = ncclientNet_pwd = Huawei123netconf = system-viewnnetconfnprotocol inbound ssh port 830nc
- 在代码中没有定义netconf变量,需要将netconf的值赋给该变量。
- 在执行命令方法中,应该先判断是否连接成功,如果未连接则先连接,如果已经连接则不需要再连接。
- 在执行命令方法中,应该先判断命令文件是否存在,如果不存在则应该提示用户。
- 在执行命令方法中,应该将输出结果保存到变量中,而不是直接输出。
- 应该在程序最后断开SSH连接。
优化后的代码如下:
import paramiko
设备的IP地址、用户名和密码
Dev_ip = '10.1.0.6' Dev_usr = 'python' Dev_pwd = 'Huawei@123' Net_usr = 'ncclient' Net_pwd = 'Huawei@123' netconf = 'system-view\nnetconf\nprotocol inbound ssh port 830\ncommit\nquit\n' Commands = 'command.txt'
class HuaweiDevice(): # 初始化华为设备类,需要传入设备的IP地址、用户名和密码 def init(self, ip, username, password): self.ip = ip self.username = username self.password = password self.ssh = None # SSH连接对象
# 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
# SSH执行命令方法
def enable_netconf(self):
if not self.ssh: # 如果未连接,则先连接
self.connect_ssh()
# 发送命令,启动Netconf功能
stdin, stdout, stderr = self.ssh.exec_command(netconf)
# 输出命令的执行结果
print(stdout.read().decode())
self.disconnect_ssh()
def status(self):
if not self.ssh: # 如果未连接,则先连接
self.connect_ssh()
try:
with open(Commands, 'r') as f:
commands = f.readlines()
except FileNotFoundError:
print('命令文件不存在,请检查!')
return
output = ''
for command in commands:
command = command.strip()
if command:
stdin, stdout, stderr = self.ssh.exec_command(command)
output += f'执行命令:{command}\n{stdout.read().decode()}\n{stderr.read().decode()}\n'
print(output)
self.disconnect_ssh()
if name == 'main': device = HuaweiDevice(ip=Dev_ip, username=Dev_usr, password=Dev_pwd) #device.enable_netconf() device.status(
原文地址: https://www.cveoy.top/t/topic/hcJ2 著作权归作者所有。请勿转载和采集!