• Expect & Shell: 网络设备配置备份


    1. 环境介绍及效果展示

    A. centos 6.6 x64
    B. tftp-server 0.49
    C. 脚本目录

    D. 备份目录

    E. 备份邮件

    2. tftp服务配置

    A. [root@steppingstone ~]# yum install tftp-server -y #安装服务
    B. [root@steppingstone ~]# vim /etc/xinetd.d/tftp #修改配置文件

    service tftp
    {
    socket_type = dgram
    protocol = udp
    wait = yes
    user = root
    server = /usr/sbin/in.tftpd
    server_args = -s -c /backup #指定tftp目录
    disable = no #开启服务
    per_source = 11
    cps = 100 2
    flags = IPv4
    }

    C. [root@steppingstone ~]# mkdir /backup #创建tftp目录
    D. [root@steppingstone ~]# chmod a+w -R /backup/ #添加读权限
    E. [root@steppingstone ~]# chkconfig tftp on #开机自启
    F. [root@steppingstone ~]# service xinetd restart #启动tftp服务

    3. 编写调用expect的shell脚本backup.sh

    A. [root@steppingstone backup]# vim backup.sh

     1     #!/bin/bash
     2     #write by William_Guozi in 2017.9.4
     3     #循环读取device_tab.txt每一行内容, 格式: ip username passwd enpasswd
     4     year=`date +'%Y'`
     5     month=`date +'%m'`
     6     day=`date +'%d'`
     7     #创建备份目录
     8     mkdir /backup/$year/$month/$day -p
     9     #给备份目录添加写权限
    10     chmod a+w -R /backup
    11     for ip in `awk '{print $1}' device_tab.txt`
    12             do
    13             #读取该IP设备的 username passwd enpasswd
    14             username=`awk -v IP="$ip" '{if(IP==$1)print $2}' device_tab.txt`
    15             passwd=`awk -v IP="$ip" '{if(IP==$1)print $3}' device_tab.txt`
    16             enpasswd=`awk -v IP=$ip '{if(IP==$1)print $4}' device_tab.txt`
    17             #向expect脚本传送四个参数username ip passwd enpasswd
    18             expect config_backup.expect $ip $username $passwd $enpasswd
    19             #判断是否执行成功, 执行结果记入日志
    20             #[ $? -eq 0 ] && echo "Device $ip backup Success!">> logname.txt || echo "Device $ip backup Failure!">> logname.txt
    21             #判断备份文件是否存在, 存在, 则备份成功, 否则, 本分失败
    22             [ -e /backup/$year/$month/$day/D-$ip ] && echo "Device $ip backup Success!">> logname.txt || echo "Device $ip backup Failure!">> logname.txt
    23     done
    24             #将日志信息发送邮件通知管理员
    25             cat logname.txt  | mail  -s "Backup Result Reports" guojxb@wumart.com
    26             #将日志送至垃圾箱
    27             mv logname.txt /tmp/logname-`date +'%F'`.txt
    backup.sh

    4. 编写expect脚本config_backup.expect

    A. [root@steppingstone backup]# vim config_backup.expect

     1 #!/usr/bin/expect -f
     2 #设定使用的shell是expect
     3 #第一个参数为设备的ip地址
     4 set ip [lindex $argv 0]
     5 #参数数组expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数
     6 #第二个参数为设备的用户名
     7 set username [lindex $argv 1]
     8 #第三个参数为设备的登录密码
     9 set passwd [lindex $argv 2]
    10 #第四个参数为设备的enable密码
    11 set enpasswd [lindex $argv 3]
    12 #时间戳
    13 set year [exec date +%Y]
    14 set month [exec date +%m] 
    15 set day [exec date +%d]
    16 #设定超时时间, timeout -1为永不超时, 单位默认是秒
    17 set timeout 5
    18 #调用ssh登录
    19 spawn ssh -l $username $ip
    20 #对返回值的可能性进行判断, 如果是"yes/no"就回送yes
    ,再回送登录密码; 如果是password, 就回送登录密码
    21 expect {
    22 "yes/no" {
    23 send "yes
    "
    24 expect "password"
    25 send "$passwd
    "
    26 }
    27 "password" { 
    28 send "$passwd
    "
    29 }
    30 }
    31 expect ">"
    32 #回送enable命令
    33 send "enable
    " 
    34 expect "Password"
    35 #回送enable密码 
    36 send "$enpasswd
    "
    37 expect "#" 
    38 #回送备份命令
    39 send "copy startup-config tftp://192.9.205.111/$year/$month/$day/D-$ip
    "
    40 # interact
    41 expect "#"
    42 #退出
    43 send "exit
    "
    44 expect eof
    45 exit
    config_backup.expect

    5. 设备信息表device_tab.txt

    A. [root@steppingstone backup]# vim device_tab.txt

    1.1.15.5 root xxxxx xxxxxx
    1.1.16.6 root xxxxx xxxxxx
    1.1.18.8 root xxxxx xxxxxx
    1.1.17.7 root xxxxx xxxxxx
    1.1.19.9 root xxxxx xxxxxx

    6. 设定定时任务

    A. corntab -e

    SHELL=/bin/bash
    #指定环境变量
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    #指定工作目录
    HOME=/root/backup
    00 16 * * * bash backup.sh >> /var/log/backup.log

  • 相关阅读:
    python学习第三课
    Linux基本操作知识一
    Linux是什么
    Django 多对多 关系
    Django 解决跨域
    支付宝支付
    django中间件
    DRF一对多序列化和反序列化
    python代码实现购物车(django的redis与vue)
    Spring 依赖注入两种方式
  • 原文地址:https://www.cnblogs.com/William-Guozi/p/Linux_expect.html
Copyright © 2020-2023  润新知