python自动抓取网络设备配置_pyton小程序自动备份网络设备配置

系统环境:

[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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值