设为首页 收藏本站
查看: 1276|回复: 0

[经验分享] python3备份juniper交换机

[复制链接]

尚未签到

发表于 2018-7-28 08:27:05 | 显示全部楼层 |阅读模式
  #!/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)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-542284-1-1.html 上篇帖子: Juniper 的NSRP协议 下篇帖子: Juniper IDP 配置简述
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表