我爱猫哥 发表于 2022-5-24 11:39

求优化代码: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()

waMoYa 发表于 2022-5-24 14:04

同品牌交换机不同型号,命令都有细微差别欸,要不前期加点工作量,给每个交换机设置一个模板文件,py根据模板文件来确定发送给交换机的命令:lol

648474073 发表于 2022-5-24 14:23

代码可读性不错,看起来没太大的问题,有需求再来修改吧,比如读取速度太慢-准确度太低等。

我爱猫哥 发表于 2022-5-24 17:21

waMoYa 发表于 2022-5-24 14:04
同品牌交换机不同型号,命令都有细微差别欸,要不前期加点工作量,给每个交换机设置一个模板文件,py根据模 ...

这个应该咋写,完全不懂

lbbas 发表于 2022-5-25 15:39

之前接触过netmiko这个库,应该能满足你的需求吧
页: [1]
查看完整版本: 求优化代码:Py登录判断交换机类型