吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 908|回复: 4
收起左侧

[求助] 求优化代码:Py登录判断交换机类型

[复制链接]
我爱猫哥 发表于 2022-5-24 11:39
公司里交换机型号较多,华为、思科、Juniper这些都有,Py刚开始学习,代码是在网上东拼西凑出来的。目前是跑起来了。希望各位大佬出手给优化一下。特别是函数这块,看的太吃力了。。多谢

[Python] 纯文本查看 复制代码
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[0])
        username =(list[1])
        password =(list[2])
        print('IP地址:%s  用户名:%s  密码:%s'%(list[0],list[1],list[2]))
        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[104:150])
                logger.info(a[104:150])                    
               
                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根据模板文件来确定发送给交换机的命令
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这个库,应该能满足你的需求吧
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 11:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表