系统环境:
[root@localhost autoback]# python
Python 2.7.9 (default, Mar 23 2017, 06:02:44)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
[root@localhost autoback]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@localhost autoback]# uname -a
Linux localhost.localdomain 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
如果没有pip工具需要下载安装,通过pip安装pexpect模块,或者通过其它方式安装pexpect模块。通过pip安装pexpect模块如下:
pip install pexpect
小程序通过FTP和TFTP进行配置文件的备份,所以需要提前在操作系统上安装FTP和TFTP的客户端:
yum install ftp tftp
本程序可以备份三种交换机的配置,或者经过修改支持备份更多的设备类型。
华三交换机和juniper交换机通过ftp进行配置备份,需要在交换机上开启ftp的服务。
h3c交换机:
ftp server enable
local-user XX
service-type ftp
juniepr交换机
set system services ftp
show configuration | display set | save config.txt 这条命令会将配置文件保存在/var/home/xx/的目录下
因为我们的思科交换机不支持ftp,所以采用了tftp的方式进行配置备份,针对思科交换机,需要开启tftp服务
思科交换机:
tftp-server nvram:startup-config
在具体的使用过程中需要注意交换机配置文件的位置,如果配置文件的位置有差异,可能会导致程序执行有问题,配置文件会备份到/data/(xx-xx-xx)的文件夹下,以日期为目录进行保存。
程序是需要创建一个名叫switch_mgt_ip.txt的文件,写入设备类型和管理IP,放在和程序同样的目录下,程序会轮询文件的每一行,读取设备型号和管理IP,并通过这个判断是执行哪一个设备型号的备份脚本,文件的内容如下所示:
h3c 1.1.1.1
cisco 2.2.2.2
下面是具体的程序示例:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pexpect
import os
import time
#定义h3c设备的配置备份函数
def ftp_h3c(ipAddress,cur_path): #参数为IP地址和当前目录
loginName = ‘XXXX‘
loginPassword = ‘XXXX‘
cmd = ‘ftp ‘ + ipAddress
child = pexpect.spawn(cmd) #通过pexpect的spawn类调用ftp子程序
index = child.expect(["(?i)name","(?i)No route to host",pexpect.EOF,pexpect.TIMEOUT]) #通过expect方法得到执行spawn后的输出
if (index == 0): #如果输出包含有name
child.sendline(loginName) #输入登录名
index = child.expect(["(?i)password",pexpect.EOF,pexpect.TIMEOUT]) #输入登录名后的提示信息
if (index != 0): #如果输入登录名后,提示没有包含password
print "ftp login failed"
child.close(force=Ture)
child.sendline(loginPassword) #如果输入登录名后,有password的提示,输入登录密码
index = child.expect( [‘ftp>‘,‘Login incorrect‘,‘Service not available‘,pexpect.EOF,pexpect.TIMEOUT])
if (index == 0): #输入密码后,有ftp>的提示,证明登录成功
print ‘Congratulations! ftp login correct!‘
child.sendline("bin") #使用二进制进行ftp的下载,二进制的下载速度快
print ‘getting a file...‘
child.sendline("get startup.cfg") #下载配置文件,需要确定配置文件名为startup.cfg
index = child.expect( [‘received.*ftp>‘,pexpect.EOF,pexpect.TIMEOUT]) #如果下载文件后,有received....ftp证明下载成功
if (index != 0):
print "failed to get file"
child.close(force=True)
print ‘successfully received the file‘
child.sendline("bye")
ptime = time.strftime("%Y-%m-%d", time.localtime()) #获取当前时间,精确到日期
cfg_name = ipAddress + ‘_‘ + ptime + ‘.cfg‘ #保存文件名以IP和日期命名
get_path = cur_path + ‘/startup.cfg‘
save_path = ‘/data/‘ + ptime + ‘/‘ + cfg_name #配置文件所保存的目录,/data/日期
Save_cfg = ‘ ‘.join([‘mv‘,get_path,save_path])
pexpect.run(Save_cfg)
elif (index == 1): #如果匹配到login incorrect说明登录失败
print " You entered an invalid login name or password,Programe quits!"
child.close(force=True)
else: #如果匹配到EOF或TIMEOUT,程序退出
print "ftp login failed! index = " + str(index)
child.close(force=True)
elif index == 1: #如果输入ftp命令后,提示no route to host说明输入主机不对,程序退出
print "ftp login failed,due to unknown host"
child.close(force=True)
else:
print "ftp login faile,due to TIMEOUT or EOF"
clild.close(force=True)
#定义思科设备的配置备份函数
def tftp_cisco(ipAddress,cur_path):
cmd = ‘tftp ‘ + ipAddress
child = pexpect.spawn(cmd) #通过pexpect的spawn类调用tftp子程序
index = child.expect( [‘tftp>‘,pexpect.EOF,pexpect.TIMEOUT]) #通过pexpect的expect方法得到执行spawn后的输出
if (index == 0):
print ‘Congratulations! tftp login correct!‘
child.sendline("get startup-config") #需要在设备上对nvram:startup-config开启tftp服务
print ‘successfully received the file‘
child.sendline("q")
ptime = time.strftime("%Y-%m-%d", time.localtime())
cfg_name = ipAddress + ‘_‘ + ptime + ‘.cfg‘
get_path = cur_path + ‘/startup-config‘
save_path = ‘/data/‘ + ptime + ‘/‘ + cfg_name
Save_cfg = ‘ ‘.join([‘mv‘,get_path,save_path])
pexpect.run(Save_cfg)
else:
print "tftp login failed! index = " + str(index)
child.close(force=True)
#定义juniper设备的配置备份函数
def ftp_juniper(ipAddress,cur_path):
loginName = ‘XXXX‘
loginPassword = ‘XXXX‘
cmd = ‘ftp ‘ + ipAddress
child = pexpect.spawn(cmd)
index = child.expect(["(?i)name","(?i)Unknow host",pexpect.EOF,pexpect.TIMEOUT])
if (index == 0):
child.sendline(loginName)
index = child.expect(["(?i)password",pexpect.EOF,pexpect.TIMEOUT])
if (index != 0):
print "ftp login failed"
child.close(force=Ture)
child.sendline(loginPassword)
index = child.expect( [‘ftp>‘,‘Login incorrect‘,‘Service not available‘,pexpect.EOF,pexpect.TIMEOUT])
if (index == 0):
print ‘Congratulations! ftp login correct!‘
child.sendline("cd /var/home/XXXX") #需要在设备上将配置保存到/var/home/XXXX的目录下,且文件名为config.txt
child.sendline("bin")
print ‘getting a file...‘
child.sendline("get config.txt")
index = child.expect( [‘received.*ftp>‘,pexpect.EOF,pexpect.TIMEOUT])
if (index != 0):
print "failed to get file"
child.close(force=True)
print ‘successfully received the file‘
child.sendline("bye")
ptime = time.strftime("%Y-%m-%d", time.localtime())
cfg_name = ipAddress + ‘_‘ + ptime + ‘.cfg‘
get_path = cur_path + ‘/config.txt‘
save_path = ‘/data/‘ + ptime + ‘/‘ + cfg_name
Save_cfg = ‘ ‘.join([‘mv‘,get_path,save_path])
pexpect.run(Save_cfg)
elif (index == 1):
print " You entered an invalid login name or password,Programe quits!"
child.close(force=True)
else:
print "ftp login failed! index = " + str(index)
child.close(force=True)
elif index == 1:
print "ftp login failed,due to unknown host"
child.close(force=True)
else:
print "ftp login faile,due to TIMEOUT or EOF"
clild.close(force=True)
file_mgtip = file(‘switch_mgt_ip.txt‘) #打开写有设备型号和管理IP的文件
data_mgtip = file_mgtip.readlines() #将文件的所有行读出
ftime = time.strftime("%Y-%m-%d", time.localtime()) #用于创建基于日期的文件夹
pexpect.run(‘mkdir -p /data/‘ + ftime)
app_path = os.getcwd() #获取程序保存路径
print app_path
for i in range(len(data_mgtip)): #根据行数进行循环
entry_mgtip = data_mgtip[i].split() #将一行以空格为分隔符拆成列表
i += 1
if (‘h3c‘ in entry_mgtip): #如果某一行包含H3C,读取后边的IP地址并调用H3C的配置备份函数
h3c_ip = entry_mgtip[1]
ftp_h3c(ipAddress = h3c_ip,cur_path = app_path)
elif (‘cisco‘ in entry_mgtip):
cisco_ip = entry_mgtip[1]
tftp_cisco(ipAddress = cisco_ip,cur_path = app_path)
elif (‘juniper‘ in entry_mgtip):
juniper_ip = entry_mgtip[1]
ftp_juniper(ipAddress = juniper_ip,cur_path = app_path)
本文出自 “系统网络” 博客,请务必保留此出处http://duanran.blog.51cto.com/1129646/1912380
原文地址:http://duanran.blog.51cto.com/1129646/1912380