python脚本备份网络设备配置文件

# _*_ coding:utf-8 _*_

"""
__title__ = '网络设备配置文件备份'
__author__ = 'Lucky'
__date__ = '2018/08/23'
"""

from logging import warning
from time import sleep,strftime,localtime
from os import mkdir
import telnetlib
import paramiko



class Telnet_Client:

    '''初始化登录参数,以及实例化telnet和ssh类'''
    def __init__(self,host_ip,username,password,port):
        self.telnet = telnetlib.Telnet()
        self.ssh = paramiko.SSHClient()
        self.host_ip = host_ip
        self.username = username
        self.password = password
        self.port = port

    def login_ssh_host(self):

        '''自动添加策略,保存服务器的主机名和公钥信息'''
        self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

        try:
            self.ssh.connect(self.host_ip,self.port,self.username,self.password,timeout=8)
            print("\nssh(%s)连接成功." %self.host_ip)
            return True
        except:
            warning("\n网络(%s)连接失败!" %self.host_ip)
            input_string = input("\n请检查网络(%s)是否畅通[ssh]" %self.host_ip)
            return False

    def login_telnet_host(self):

        '''可能有些机器远程连接会连不上,这里做异常捕获'''
        try:
            self.telnet.open(self.host_ip,self.port,timeout=10)
        except:
            warning("\n网络(%s)连接失败!" %self.host_ip)
            input_string = input("\n请检查网络(%s)是否畅通[telnet]" % self.host_ip + "\n")
            return False
        else:

            '''
                这里用read_until方法进行匹配登录字符是否为login,是的话输入用户名,最多等待10秒
                这里在强调一下telnet需要传入的内容为bytes,所以需要encode一下
            '''
            self.telnet.read_until(b'Username: ',timeout=10)
            self.telnet.write(self.username.encode('ascii') + b'\n')

            # 等待Password出现后输入密码,最多等待10秒
            self.telnet.read_until(b'Password: ',timeout=10)
            self.telnet.write(self.password.encode('ascii') + b'\n')

            # 等待1秒给设备一个缓冲时间
            sleep(1)

            # read_very_eager()获取上次程序执行的结果
            last_command_result = self.telnet.read_very_eager().decode('ascii')

            # 判断上次结果是否有登录错误的
            if 'Login incorrect' not in last_command_result:
                print('\ntelnet(%s)登录成功.' %self.host_ip)
                return True
            else:
                warning('\n登录(%s)失败,用户名或密码错误!' %self.host_ip)
                return False

    # 执行telnet命令
    def execute_some_command(self,
                             command_telnet_user,
                             command_telnet_password,
                            command_telnet_copy_to_ftp,
                             command_telnet_to_ftp_1,
                             command_telnet_to_ftp_2,
                            command_telnet_to_ftp_3):

        str_time = strftime("%Y%m%d", localtime())
        backup_cfg = self.host_ip + "_" + str_time + ".txt"

        # 执行传入的命令,这里也需要将传入的命令进行encode处理
        self.telnet.write(command_telnet_user.encode('ascii') + b'\n')
        self.telnet.write(command_telnet_password.encode('ascii'))
        self.telnet.write(command_telnet_copy_to_ftp.encode('ascii'))
        self.telnet.write(command_telnet_to_ftp_1.encode('ascii'))
        self.telnet.write(command_telnet_to_ftp_2.encode('ascii'))
        try:
            self.telnet.write(backup_cfg.encode('ascii') + command_telnet_to_ftp_3.encode('ascii'))
        except Exception as e:
            print("telnet(%s)备份网络配置文件失败!" %self.host_ip)
        else:
            print("\ntelnet登录(%s)后网络配置文件备份成功." %self.host_ip)

        # 等待1秒给设备一个缓冲时间
        sleep(1)

        # 获取命令执行结果
        # exec_command_result = self.telnet.read_very_eager().decode('ascii')
        # print(exec_command_result)

    # 执行ssh命令
    def execute_ssh_command(self,command):
        stdin, stdout, stderr = self.ssh.exec_command(command)

        # 等待1秒给设备一个缓冲时间
        sleep(1)

        result = stdout.readlines()
        str_time = strftime("%Y%m%d", localtime())
        # mkdir(str_time)
        with open(str_time + "\\" + self.host_ip + "_" + str_time + ".txt","w",encoding="utf-8") as result_ssh_obj:
            for line in result:
                try:
                    result_ssh_obj.write(line.strip() + "\n")
                except Exception as e:
                    print("备份(%s)设备上的网络配置文件失败,错误代码为:%s" %(self.host_ip,e))
                else:
                    print("\nssh登录(%s)后网络配置文件备份成功." %self.host_ip)

    # 退出telnet函数
    def logout_telnet(self):
        self.telnet.write(b"exit\n")

    # 退出ssh函数
    def logout_ssh(self):
        self.ssh.close()

def main():
    str_time = strftime("%Y%m%d", localtime())
    mkdir(str_time)

    command_telnet_user = "enable\n"
    command_telnet_password = "123456\n"
    command_telnet_copy_to_ftp = "copy run tftp://192.168.2.2\n"
    command_telnet_to_ftp_1 = "\n"
    command_telnet_to_ftp_2 = "\n"
    command_telnet_to_ftp_3 = "\n"

    command_ssh = "show run"

    # ssh和telnet调用过程
    with open('ssh_host.txt', 'r', encoding='utf-8') as ssh_obj, \
            open('telnet_host.txt', 'r', encoding='utf-8') as telnet_obj:
        for ssh_ip in ssh_obj:
            # 根据类实例化一个ssh对象
            ssh_client = Telnet_Client(ssh_ip.strip(), 'admin', '123456', '22')

            # 根据函数的返回值进行判断是否继续执行别的函数
            if ssh_client.login_ssh_host():
                ssh_client.execute_ssh_command(command_ssh)
                ssh_client.logout_ssh()

        for ip in telnet_obj:
            # 根据类实例化一个telnet对象
            telnet_client = Telnet_Client(ip.strip(), 'admin', '123456', '23')

            # 根据函数的返回值进行判断是否继续执行别的函数
            if telnet_client.login_telnet_host():
                telnet_client.execute_some_command(command_telnet_user,
                                                   command_telnet_password,
                                                   command_telnet_copy_to_ftp,
                                                   command_telnet_to_ftp_1,
                                                   command_telnet_to_ftp_2,
                                                   command_telnet_to_ftp_3)
                telnet_client.logout_telnet()

if __name__ == '__main__':
    main()

  

猜你喜欢

转载自www.cnblogs.com/zhangweiyi/p/10533983.html