目录回顾:
根据前面所学习的知识,可以远程登录设备下发命令等,现在已经可以转化为生产力了哈,今天小Q要实现的就是一个批量备份配置的小东西,
小Q通过学习产品文档了解到,可以通过以下四种方法进行备份配置文件:
a)直接屏幕拷贝。
b)备份配置文件到存储器中。
c)通过TFTP备份配置文件。
d)通过FTP备份配置文件。
小Q对这几种备份方式做了一个小对比,
a)直接屏幕拷贝 -屏幕上显示的配置信息受终端软件的影响,可能会出现某配置过长而换行的情况,而换行的配置可能无法恢复。 -丢弃此方式
b)备份配置文件到存储器中 ?受ENSP环境所限制,可以实现么? 不了解,丢弃此方式
c)通过TFTP备份配置文件 ?对设备无修改无变动 ?完美啊
d)通过FTP备份配置文件 ?备份时需要启动FTP服务器功能,对设备配置有变动,涉及安全性-丢弃此方式
既然采用TFTP的方式备份配置文件,
采用如下的思路进行配置:
a)保存配置文件。-执行命令 save config.cfg
b)通过TFTP备份配置文件。-需要一个tftp server,然后在设备上执行上传命令
组网图如下
要完成的备份脚本程序的组成模块如下:
首先实现备份程序的功能,直接修改第2章的内容,将多个设备信息已固定格式保存在一个txt里面,如下:
IP:用户名:密码
修改上次的ssh登录,使其支持多设备,代码如下(代码中依然增加了注释):
#!/usr/bin/python
#coding=utf-8
# 批量备份配置文件小脚本
from Exscript.util.interact import read_login
from Exscript.protocols import SSH2
from Exscript import Account
import os
import time
import datetime
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
def LoginSSH(_Host,_Username,_Password) :
print "[+] Loging Host : %s " % _Host
account = Account(_Username,_Password)
ssh = SSH2()
try :
print "[+] Trying to Login in with username: %s password: %s " % (_Username,_Password)
ssh.connect(_Host)
ssh.login(account)
except Exception,e:
print "[-] Failed! ...",e
return 'LoginError',ssh
print "[+] Success ... username: %s and passoword %s is VALID! " % (_Username, _Password)
return 'LoginSuccess',ssh
def StartExecuteBackup(sshConnection,SaveCfgFileName):
BackUpCommand = 'save %s' % SaveCfgFileName
sshConnection.execute('dir')
# 判断是否已经存在备份文件,发现=1,未发现=0
CfgFileStatus = 0
if SaveCfgFileName in sshConnection.response:
CfgFileStatus = 1
sshConnection.set_prompt(r'y/n')
sshConnection.execute(BackUpCommand)
# 备份文件不存在时,确认一次
if CfgFileStatus == 0:
sshConnection.set_prompt()
sshConnection.execute('y')
print '[*] Save the configuration to %s' % SaveCfgFileName
# 备份文件存在时,确认两次,进行覆盖
else:
sshConnection.execute('y')
sshConnection.set_prompt()
sshConnection.execute('y')
print '[*] Overwrite %s '% SaveCfgFileName
def StartExecuteTftpUpload(sshConnection,TFtpHost,SaveCfgFileName):
# tftp IP put config.cfg backup.cfg
print '[*] Uploading the file to the remote TFTP server. Please wait...'
TFtpUpFileCommand = "tftp %s put %s %s" % (TFtpHost,SaveCfgFileName,SaveCfgFileName)
sshConnection.execute(TFtpUpFileCommand)
print '[*] TFTP: Uploading the file successfully.'
if __name__ == '__main__':
TFtpHost = raw_input("[*] Please Input Tftp server Adress:>")
# 读取多设备列表文件
HostFile = 'HostList.txt'
Date = datetime.date.today().strftime("%Y-%m-%d")
for line in open(HostFile, "r").readlines():
HostinfoList = line.strip().split(':')
_Host = HostinfoList[0]
_Username = HostinfoList[1]
_Password = HostinfoList[2]
LoginResult,sshConnection = LoginSSH(_Host,_Username,_Password)
# 登录成功后即可执行命令,基本检查信息
if LoginResult == 'LoginSuccess':
# 设置生成的配置文件名
SaveCfgFileName = '%s_%s_config.cfg' % (_Host,Date)
# 生成配置文件
StartExecuteBackup(sshConnection,SaveCfgFileName)
# 备份配置文件到tftp服务器
StartExecuteTftpUpload(sshConnection,TFtpHost,SaveCfgFileName)
# 关闭连接
#sshConnection.close()
print '[*] Session Close.'
然后,我们在编写一个tftp server小脚本(其他类似tftp软件一样可以的),用来接收从设备上传的配置文件,并保存,代码非常简单如下:
#!/usr/bin/python
#coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import tftpy
import ConfigParser
config = ConfigParser.RawConfigParser()
# 如果要设置保存的目录,修改tftpcfg.cfg即可
config.read('tftpcfg.cfg')
directory = config.get('config','directory')
server = tftpy.TftpServer(directory)
print '[*] Tftp: 0.0.0.0'
print '[*] Upfile in:',directory
server.listen('0.0.0.0', 69)
使用时要设置tftp server工作目录,修改tftpcfg.cfg即可,如下:
好的现在一些都准备完毕了,首先启动我们的tftp
server软件,
然后运行我们的批量备份配置程序,运行后先输入Tftp服务器的ip,脚本将会自动进行配置备份,效果如下:
此时在查看tftp的目录,已经获取到了配置文件,如下:
目前这个小脚本异常处理还未考虑,所以仅限测试使用哦,相信简单修改下就可以使用了哈。
提示:可以将脚本生成exe的格式,就可以运行在无python环境的电脑了,附件将会进行打包提供下载,方便各位根据实际环境修改。