求优化代码:Py登录判断交换机类型
公司里交换机型号较多,华为、思科、Juniper这些都有,Py刚开始学习,代码是在网上东拼西凑出来的。目前是跑起来了。希望各位大佬出手给优化一下。特别是函数这块,看的太吃力了。。多谢import logging
import telnetlib
import time
import re
import xlrd
def get_logger(filename='交换机端口管理日志.log'):
"""
获取保存日志logger
:param filename: 文件名,包含全绝对路径
:return:
"""
logger = logging.getLogger(__name__)
logger.setLevel(level=logging.INFO)
handler = logging.FileHandler(filename, encoding='utf-8')
handler.setLevel(logging.INFO)
formatter = logging.Formatter('')
handler.setFormatter(formatter)
logger.addHandler(handler)
return logger
logger = get_logger()
class TelnetClient(object):
def __init__(self, ip, user, pswd):
self.tn = telnetlib.Telnet()
self.host_ip = ip
self.username = user
self.password = pswd
self.last_res = ''# 记录上次命令执行结果
# 此函数实现telnet登录主机
def login_host(self):
try:
# self.tn = telnetlib.Telnet(host_ip,port=23)
self.tn.open(self.host_ip)
except:
text = '{} 网络连接失败'.format(self.host_ip)
print(text)
logger.info(text)
return False
# 等待login出现后输入用户名,最多等待10秒
self.tn.read_until(b'Username: ', timeout=1)
self.tn.write(self.username.encode('ascii') + b'\n')
# 等待Password出现后输入用户名,最多等待10秒
self.tn.read_until(b'Password: ', timeout=1)
self.tn.write(self.password.encode('ascii') + b'\n')
# 延时5秒再收取返回结果,给服务端足够响应时间
time.sleep(1)
# 获取登录结果
# read_very_eager()获取到的是的是上次获取之后本次获取之前的所有输出
command_result = self.tn.read_very_eager().decode('utf-8')
if 'Login invalid' in command_result:# 交换登录失败提示语
text = '{} 登录失败,用户名或密码错误'.format(self.host_ip)
print(text)
return False
else:
text = '{} 登录成功'.format(self.host_ip)
print(text)
return True
# 输入命令,并输出执行结果
def execute_some_command(self):
# 执行命令
while True:
command = input("请输入要执行的命令: ")
if command == "exit" and 'config' not in self.last_res:
print('不在配置模式下,退出登录')
break
self.tn.write(command.encode() + b'\n')
time.sleep(1)
# 获取命令结果
command_result = self.tn.read_very_eager().decode('utf-8')
print('命令执行结果:%s' % command_result)
self.last_res = command_result# 结果保存,用于下次输入exit判断是否退出登录
# 执行某一条命令
def execute_command(self, command, show_res=False):
self.tn.write(command.encode() + b'\n')
time.sleep(1)
# 获取命令结果
command_result = self.tn.read_very_eager().decode('utf-8')
if show_res:
print('命令执行结果:%s' % command_result)
return command_result
# 退出telnet
def logout_host(self):
self.tn.write(b"exit\n")
#logger.info('本次操作结束,连接断开\n')
def print_port_status(port, res):
now_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
text = '{}端口状态:'.format(port)
if 'notconnect' in res:
text += '无连接'
elif 'connected' in res:
text += '已连接'
elif 'disabled' in res:
text += '未启用'
else:
text += '端口状态为其他'
print(text)
logger.info(text)
if __name__ == '__main__':
# 指定连接的交换机管理IP
workbook = xlrd.open_workbook('D:\python\交换机管理地址.xlsx')
sheet1= workbook.sheet_by_name('Sheet1')
for i in range(sheet1.nrows):
list = sheet1.row_values(i)
host_ip =(list)
username =(list)
password =(list)
print('IP地址:%s用户名:%s密码:%s'%(list,list,list))
print('*'*20)
ip = host_ip
telnet_client = TelnetClient(ip=ip, user=username, pswd=password)
# 如果登录结果返加True,则执行命令,然后退出
if telnet_client.login_host():
# 手动输入执行命令
# telnet_client.execute_some_command()
# 执行指定命令
# telnet_client.execute_command('dis ve')# 进入特权模式
res1 = telnet_client.execute_command('dis ve')
print('显示屏幕信息'+res1)
if 'unknow' in res1:
# 开启
text = ip + '\t Juniper'
print(text)
logger.info(text)
telnet_client = telnet_client.execute_command('show version brief')
a=telnet_client
print(a)
print('00000')
print(a)
logger.info(a)
print('0000000000000000')
elif 'Huawei' in res1:
# 关闭
text = ip + '\t Huawei'
print(text)
logger.info(text)
telnet_client = telnet_client.execute_command('dis version')
telnet_client = telnet_client.find(':')
print('***' + telnet_client)
# telnet_client.execute_command('quit \n')# 退出配置模式
text = '↑——执行完毕——↓'
print(text)
#logger.info(text)
# 退出登录
telnet_client.logout_host()
同品牌交换机不同型号,命令都有细微差别欸,要不前期加点工作量,给每个交换机设置一个模板文件,py根据模板文件来确定发送给交换机的命令:lol 代码可读性不错,看起来没太大的问题,有需求再来修改吧,比如读取速度太慢-准确度太低等。 waMoYa 发表于 2022-5-24 14:04
同品牌交换机不同型号,命令都有细微差别欸,要不前期加点工作量,给每个交换机设置一个模板文件,py根据模 ...
这个应该咋写,完全不懂 之前接触过netmiko这个库,应该能满足你的需求吧
页:
[1]