zoukankan      html  css  js  c++  java
  • 某园区网自动批量备份交换机配置

    一、需求分析:某园区网络可管理的交换机大约有几十台,因运维工作需要,应定期进行配置备份,若每次手工备份的话费时费力,考虑开发批量备份功能。 

    二、思路:

    1、所有交换机都是telnet方式登录,考虑使用一台linux虚拟机做自动备份管理机,使用shellexpect软件进行管理程序开发。

    2、园区网络交换机配置技术类似华为和思科,交换机的登录模式有三种:类思科交换机登录需要用户名、密码和en密码;类华为交换机的登录需要用户名和密码;类华为的某型号交换机登录只需要密码。

    3、程序结构

      

    三、程序代码

    方法一:(取消备份文件奇异字符的代码放在shell程序中)

    1、交换机参数列表文件:swhosts.txt

    [root@localhost ~]# vi swhosts.txt

    10.10.2.26|username|password|enpassword

    10.10.2.28|username|password|null

    10.10.3.51|null|password|null

    2、Shell程序文件:sw.sh

    [root@localhost ~]# vi sw.sh

    #!/bin/bash

    for line in `cat /root/swhosts.txt`

    do

       ip=`echo $line | awk -F "|" '{print $1}'`

       login=`echo $line | awk -F "|" '{print $2}'`

       password=`echo $line | awk -F "|" '{print $3}'`

       enpassword=`echo $line | awk -F "|" '{print $4}'`

       erabadsym1="s+----s+Mores+----^[[42Ds+^[[42D"

    #特殊字符^[不能拷贝使用,只能使用键盘输入,方法:CTRL+V+[,类似的特殊字符都可以参照此CTRL+V+字符的方式进行输入;“s”代表空格,“+”表示一个或多个前面的字符。“s+”表示一个或多个空格。

       erabadsym2="s+--More--s+^H+s+^H+"

    #“^H+”表示一个或多个“^H”字符

       filename="/root/swconfig/`date +%Y-%m-%d`.$ip.txt"

       /root/sw.exp $ip $login $password $enpassword $filename

        if [ -f $filename ]; then

          if [ $enpassword == "null" ];then

     

           sed -i s/$erabadsym1/""/g $filename

          else

           sed -i s/$erabadsym2/""/g $filename

          fi

        else

          echo `clock` >> /root/swconfig/error.log

          echo "The ip $ip is not arrive! at " `clock` >> /root/swconfig/error.log

          echo "The ip $ip is not arrive!" | mail -s "$ip error!" sfccl@qq.com

        fi

     

    done

     

    3、Expect程序文件:sw.exp

    [root@localhost ~]# vi sw.exp

    #!/usr/bin/expect

     

    if { $argc != 5} {

       send_user "用法: $argv0 < ip > < login > < password > < enpassword > < filename > "

       exit

    }

     

     

    set timeout 3

    set TERM ANSI

     

    set IPADD [lindex $argv 0]

    set LOGIN [lindex $argv 1]

    set PASSWD [lindex $argv 2]

    set ENPASSWD [lindex $argv 3]

    set FILENAME [lindex $argv 4]

    set PROMPTSYM1 "*#"

    set PROMPTSYM2 "*>"

    set CONCMD1 "sh run "

    set CONCMD2 "dis cu "

    set EXIT1 "exit "

    set EXIT2 "quit "

     

    #模拟按空格键子程序

    proc dospace { Filename CONCMD PROMPTSYM EXITn} {

    log_file $Filename

    send $CONCMD

    while (1) {

       sleep 1

       expect {

          "*More*" { send " "}

          $PROMPTSYM { break }

       }

    }

    send $EXITn

    #expect eof

    interact

    }

     

    #交换机登录子程序

    proc dologin { username password } {

      expect {

         "*sername:" { send "$username "; exp_continue}

         "*assword:" { send "$password "; exp_continue}

      }

    }

     

     

    #测试目标交换机是否可达,可达才能进入获取配置进程。

    spawn ping -c 3 $IPADD

    sleep 3

    expect {

      "64 bytes*" {send_user "the ip is ok! "}

      timeout { send_user "the ip ip is bad! " ;exit }

      eof { exit }

    }

     

    #获取交换机配置主程序

    spawn telnet

    expect "telnet>"

    send "open $IPADD "

    sleep 5

     

    if { $ENPASSWD != "null" } {

    dologin $LOGIN $PASSWD

     

    expect {

       $PROMPTSYM2  { send "en ";exp_continue}

       "*assword:" { send "$ENPASSWD ";exp_continue}

    }

    sleep 1

    expect $PROMPTSYM1

    dospace $FILENAME $CONCMD1 $PROMPTSYM1 $EXIT1

    }

     

    if { $ENPASSWD == "null" } {

    dologin $LOGIN $PASSWD

    sleep 1

    expect $PROMPTSYM2

    dospace $FILENAME $CONCMD2 $PROMPTSYM2 $EXIT2

    }

     
    方法二:(取消备份文件奇异字符的代码放在exp程序中)
     
    (1)shell程序sw1.sh的代码:
    [root@localhost ~]# vi sw1.sh
    #!/usr/bin/sh
     
    for line in `cat /root/swhosts.txt`
    do
          IP=`echo $line | awk -F '|' '{print $1}'`
          ID=`echo $line | awk -F '|' '{print $2}'`
          PASSWD=`echo $line | awk -F '|' '{print $3}'`
          ENPASSWD=`echo $line | awk -F '|' '{print $4}'`
    #      echo $IP,$ID,$PASSWD,$ENPASSWD
          /root/sw1.exp $IP $ID $PASSWD $ENPASSWD
    done
     
    (2)exp程序sw1.exp的代码:
    [root@localhost ~]# vi sw1.exp
    #!/usr/bin/expect
    if { $argc != 4 } {
        send_user "用法:$argv0 < ip > < id > < password > < enpassword > "
        exit
    }
     
    set timeout 1
    set TERM ANSI
     
    set IP [lindex $argv 0]
    #send_user $IP
    set ID [lindex $argv 1]
    set PASSWD [lindex $argv 2]
    set ENPASSWD [lindex $argv 3]
    set SYM1 "*>"
    set SYM2 "*#"
    set QUITSYM1 "exit "
    set QUITSYM2 "quit "
    set FILE "/root/swconfig1/[exec date +%F-%H:%M:%S].$IP.txt"
    set QIYISYM1 15
    set QIYISYM2 .*115157162145.*10
    set QIYISYM3 .*115157162145.*33.6462104
    #15是^M的八进制码,相应的115、157、162、145对应More,10对应^H,33对应^[,6462104对应42D
     
    proc login {id password} {
      expect {
      "*sername:" {send $id ;exp_continue}
      "*assword:" {send $password }
      }
    }
     
    proc dospace {sym quitsym} {
      while (1) {
       send " "
       sleep 1
       expect {
         "*More*" {send ""}
         "$sym" { break }
       }
      }
     send $quitsym
    # expect eof
     interact
    }
     
    spawn ping -c 3 $IP
    sleep 3
    expect {
      "64 bytes" { send_user  "The ip is ok! "}
      timeout {exit}
      eof {exit}
    }
    sleep 1
     
    spawn telnet
    expect "telnet>"
    send "open $IP "
    sleep 8
    login $ID $PASSWD
    sleep 1
    expect $SYM1
    if { $ENPASSWD != "null"} {
       send "en "
       expect "Password:"
       send $ENPASSWD
       expect $SYM2
    #   log_file /root/swconfig1/[exec date "+%F"].$IP.txt
    #   log_file /root/swconfig1/[clock format [clock seconds] -format "%Y-%m-%d"].$IP.txt
       log_file $FILE
       sleep 2
       send "sh run "
       dospace $SYM2 $QUITSYM1
       exec sed -i s/$QIYISYM1//g $FILE
       exec sed -i s/$QIYISYM2//g $FILE
    }
     
    log_file $FILE
    sleep 2
    send "dis cu "
    dospace $SYM1 $QUITSYM2
    exec sed -i s/$QIYISYM3//g $FILE
     

    4、修改运行程序文件属性,增加执行权限

    [root@localhost ~]# chmod +x sw.sh

    [root@localhost ~]# chmod +x sw.exp

    5、配置定时运行

    [root@localhost ~]# crontab -e

    ...

    55 23 * * * /root/sw.sh      

    #说明:每晚23:55启动自动备份程序sw.sh

    四、测试

    2019-1-31测试通过,在/root/swconfig目录下正常生成备份文件。

     小结:

    1、使用shell和expect工具进行交换机配置备份是比较容易实现的方法。

    2、在shell中的编程和在expect中的编程有较大的差异,比如,变量赋值就明显不同,要特别注意。

    3、在expect中的正则表达式有许多细节需要注意,特别是中括号的使用要小心。

  • 相关阅读:
    Classloader中loadClass()方法和Class.forName()区别
    java.lang.Class解析
    JDK_Proxy_InvocationHandler_动态代理
    spring之Annotation
    annotation之@Autowired、@Inject、@Resource三者区别
    spring之生命周期
    spring之lazy-init
    我是如何在SQLServer中处理每天四亿三千万记录的
    (转)SQL一次性插入大量数据
    SQL SERVER连接池
  • 原文地址:https://www.cnblogs.com/sfccl/p/11246871.html
Copyright © 2011-2022 走看看