前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python3备份juniper交换机

python3备份juniper交换机

作者头像
py3study
发布2020-01-03 16:27:09
5960
发布2020-01-03 16:27:09
举报
文章被收录于专栏:python3

#!/usr/bin/env python3 # -*- coding: utf-8 -*- """   Author:  Linxy -- <592901071@qq.com>   Purpose: Juniper备份脚本   Created: 2017-6-23 """

import datetime import sys import os import telnetlib from email import encoders from email.header import Header from email.mime.text import MIMEText from email.utils import parseaddr, formataddr import smtplib su=[] fa=[]

#获取年月日的str数据 def getymd (ymd):  d=datetime.datetime.now()  if ymd=='y':   return str(d.year)  elif ymd=='m':   return str(d.month)  elif ymd=='d':   return str(d.day)

#p1='./switch/'+getymd('y')+'/'+getymd('m')+'/'+getymd('d') l1=[getymd('y'),getymd('m'),getymd('d')] #print(l1) p1='./switch' if os.path.isdir(p1):   pass else:    os.mkdir(p1) for i in l1:  p1=p1+'/'+i  if os.path.isdir(p1):   pass  else:    os.mkdir(p1)

filename1='./sw.txt'#交换机IP地址列表存放位置 注意要把最后一个IP以后的空格和回车全部删除 filename2='./ssg.txt'  def fc_srx(p2): #文件处理部分的函数  if os.path.getsize(p2)==0:   '''   密码不对时候 telnet的执行是成功的只是read_all的时候没有结尾的标记所以无法读出返回值   但仍然会建立空txt文档所以需要在此再进行一次判断并把需要的值写入fa[]中   '''   fa.append(host+'\n')   print(host+" is failed")  else:   with open(p2,'r') as f:    lines=f.readlines()   with open(p2,'w') as w:    for I in lines:     I=I.replace('---(more)---','')     I=I.replace('                                        ','')     I=I.replace('\r','')     I=I.replace('\n','')     if I=='':      pass     else :      w.write(I+'\r\n')  def fc_ssg(p2):  if os.path.getsize(p2)==0:   #print(host+' is failed')   '''   密码不对时候 telnet的执行是成功的只是read_all的时候没有结尾的标记所以无法读出返回值   但仍然会建立空txt文档所以需要在此再进行一次判断并把需要的值写入fa[]中   '''   fa.append(host+'\n')   print(host+" is failed")  else:   with open(p2,'r') as f:    lines=f.readlines()   with open(p2,'w') as w:    for I in lines:     I=I.replace('--- more ---','')     I=I.replace(' ','')     I=I.replace('\r','')     I=I.replace('\n','')     if I=='':      pass     else :      w.write(I+'\r\n')  def juniper_bak (host):#备份juniper函数  user='这里是交换机帐号'  password='这里是交换机密码'  print ('Backing up:'+host)  tn=telnetlib.Telnet(host.encode('utf-8'),port=23,timeout=4)  tn.read_until(b"login:")  tn.write(user.encode('utf-8')+'\n'.encode('utf-8'))  tn.read_until(b"Password:")  tn.write(password.encode('utf-8')+'\n'.encode('utf-8'))  tn.read_until(b'> ')  tn.write(b'show configuration | display set '+'\n'.encode('utf-8'))  for i in range(300) :   tn.write(b' ')  tn.write(b'q\n')  tn.write(b'q\n')

 p2=p1+'/'+host+'/'+host+'.txt'  if os.path.isdir(p1+'/'+host):   pass  else:    os.mkdir(p1+'/'+host)

 with open(p2,'w') as f:   f.write(tn.read_all().decode())  tn.close()  fc_srx(p2) def ssg_bak (host):#备份ssg函数  user='这里是ssg设备帐号'  password='这里是ssg设备密码'  print ('Backing up:'+host)  tn=telnetlib.Telnet(host.encode('utf-8'),port=23,timeout=4)  tn.read_until(b"login:")  tn.write(user.encode('utf-8')+'\n'.encode('utf-8'))  tn.read_until(b"password:")  tn.write(password.encode('utf-8')+'\n'.encode('utf-8'))  tn.read_until(b'>')  tn.write(b'get config'+'\n'.encode('utf-8'))  for i in range(50000) :#看具体设备有些设备输入200个空格即可获取到全部回显   tn.write(b' ')  tn.write(b'exit\n')  p2=p1+'/'+host+'/'+host+'.txt'  if os.path.isdir(p1+'/'+host):   pass  else:    os.mkdir(p1+'/'+host)  with open(p2,'w') as f:   f.write(tn.read_all().decode(encoding='gbk'))  tn.close()  fc_ssg(p2)

def sendmail_cxr(tx):#发送邮件函数  def _format_addr(s): #注意此函数实际传入的S格式为‘字符串 <邮箱地址>’   name, addr = parseaddr(s)   return formataddr((Header(name, 'utf-8').encode(), addr))   from_addr = '这里是发送邮件的邮箱地址'  password = '这里是邮箱密码'  to_addr = '接收邮件的地址1'  to_addr2='接收邮件的地址2'  smtp_server = 'SMT服务的域名要写这里'  msg = MIMEText(tx, 'plain', 'utf-8')

 msg['From'] = _format_addr('邮件相关的格式不要细究 <%s>' % from_addr)  msg['To'] = _format_addr('邮件相关的格式不要细究 <%s>'% to_addr)  msg['Subject'] = Header('今日备份情况', 'utf-8').encode()  #邮件主题

 server = smtplib.SMTP(smtp_server, 25)  #server.set_debuglevel(1)  server.login(from_addr, password)  server.sendmail(from_addr, [to_addr,to_addr2], msg.as_string())  server.quit() 

if __name__=='__main__':  with open (filename2,'r')as fo:   for line in fo.readlines():    if line.split(' ')[0]!='':     line=line.replace('\n','')     host=line.split(' ')[0]     try:      ssg_bak(host)      su.append(host+'\n')     except:      print(host+" is failed")      fa.append(host+'\n')

 with open (filename1,'r')as fo:   for line in fo.readlines():    if line.split(' ')[0]!='':     line=line.replace('\n','')     host=line.split(' ')[0]     try:      juniper_bak(host)      su.append(host+'\n')     except:      print(host+" is failed")      fa.append(host+'\n')   '''   密码不对时候 telnet的执行是成功的只是read_all的时候没有结尾的标记所以无法读出返回值   但仍然会建立空txt文档所以需要在文本处理环节再进行一次判断并把需要的值写入fa[]中   '''  #print(su)  #print(fa)  tx=''  if len(su)!=0:   txsu='备份成功\n'+''.join(su)   csu=0   for i in su:    csu=csu+1   tx=tx+txsu+'总计成功'+str(csu)+'个'+'\n\n'  if len(fa)!=0:   cfa=0   for i in fa:    cfa=cfa+1   txfa='备份失败\n'+''.join(fa)   tx=tx+txfa+'总计失败'+str(cfa)+'个'+'\n\n'  sendmail_cxr(tx)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档