一般的企业都有网络架构下面都会有非常多的交换机,这些交换机设备我们一般都会定期进行备份的。少量的手搓还可以的,但是如果几十几百台的话,那还不得累死人的。这里一般我们都会使用脚本处理,今天给大家分析一个 Python 批量备份交换机配置到 Tftp 服务器下面。

1.部署运行环境

1.准备一台 Linux 服务器搭建好 Python 3.0 的环境(这样方便定时备份),用 Windows 或者使用 Pycharm 都可以。

2.准备一个 Tftp 服务用于备份,如果使用 Linux 跑 Python 环境可以直接部署一个。Windows 的话可以安装一个3cdaemon

2.交换机准备

我们需要罗列出所有交换机的 IP 地址,然后交换机的账户密码也需要一样的,这样才能方便我们批量处理。

所有交换机 IP 使用一个.txt 文件 和 Python 脚本放在一个目录。然后修改脚本中的交换机账户和密码为实际中的,Tftp 服务器地址给位自己的就可以运行了。

我这边测试 100 台交换机 1 分钟就备份好了。

脚本运行中
import logging
import telnetlib
import time
import datetime
from multiprocessing import Pool


class TelnetClient():
    def __init__(self,):
        self.tn = telnetlib.Telnet()

    # 此函数实现telnet登录主机
    def login_host(self,host_ip,username,password):
        try:
            # self.tn = telnetlib.Telnet(host_ip,port=23)
            self.tn.open(host_ip,port=23)
        except:
            logging.warning('%s网络连接失败'%host_ip)
            return False
        # 等待login出现后输入用户名,最多等待10秒
        self.tn.read_until(b'Username: ',timeout=10)
        self.tn.write(username.encode('ascii') + b'n')
        # 等待Password出现后输入用户名,最多等待10秒
        self.tn.read_until(b'Password: ',timeout=10)
        self.tn.write(password.encode('ascii') + b'n')
        # 延时两秒再收取返回结果,给服务端足够响应时间
        time.sleep(2)
        # 获取登录结果
        # read_very_eager()获取到的是的是上次获取之后本次获取之前的所有输出
        command_result = self.tn.read_very_eager().decode('ascii')
        if 'Login failed' not in command_result:
            logging.warning('%s登录成功'%host_ip)
            return True
        else:
            logging.warning('%s登录失败,用户名或密码错误'%host_ip)
            return False

    # 此函数实现执行传过来的命令,并输出其执行结果
    def execute_some_command(self,command):
        # 执行命令
        self.tn.write(command.encode('ascii')+b'n')
        time.sleep(2)
        # 获取命令结果
        command_result = self.tn.read_very_eager().decode('ascii')
        # command_result=self.tn.read_all().decode('ascii')
        logging.warning('命令执行结果:n%s' % command_result)

    # 退出telnet
    def logout_host(self):
        self.tn.write(b"quitn")

#执行交换机备份
def switchbak(i,u,p,c):
    telnet_client = TelnetClient()
    if telnet_client.login_host(i,u,p) :
        telnet_client.execute_some_command(c)
        telnet_client.logout_host()

if __name__ == '__main__':
    print('开始多进程并发备份')
    start=time.时间()
    #50为进程数,用户可根据客户端及服务器配置自行调整,注意:过大进程易被安全软件识别为恶意攻击
    p=Pool(50)
    for ip in open('switchs.txt').readlines():
        ip=ip.strip()
        #交换机具备backup命令的telnet用户
        username = 'admin'
        #该用户密码
        password = 'admin'
        #tftp服务器地址
        ftphost ='TFTP IP'
        filename = ip.replace('.','.')+ '-'+datetime.date.today().strftime('%Y%m%d')+'.cfg'
        command1 = 'backup startup-configuration to ' +(ftphost)+' '+ filename
        p.apply_async(switchbak,args=(ip,username,password,command1))
    p.close()
    p.join()
    end=time.time()
    print('备份完成,耗时:%0.2f 秒' %(end-start) )

我这边是使用的 Pycharm 跑的,安装完直接使用,脚本我也忘记是哪里来的了,Github 上面很多类似脚本。