脚本作用:自动定期备份网络设备配置
支持的设备: 华为(HW) 锐捷(RJ) H3C 思科(Cisco/oldC/AC)

准备环境

安装linux操作系统(已有可跳过)

只要使用的Linux支持expect命令即可使用此脚本
如果目前没有已安装的Linux建议下载安装 Debian 12.1 X64

全新安装Linux只需要最小化安装即可

安装expect

debian/unbuntu安装expect

apt install expect

CentOS/redhat安装expect

yum install expect

需要选定一个目录保存脚本和配置文件,这里以/backup为例

创建交换机信息文件

运行如下命令创建交换机信息文件swlist,将自己站点内需要定期备份配置的设备按照下面的格式填入文件中

nano /backup/swlist

文件示例如下:

100.222.5.10 username Password XXXAC001 AC enablePassword
192.168.1.24 username Password XXXSW001 oldC enablePassword
192.168.1.71 username Password XXXSW004 Cisco enablePassword

第一列为设备IP
第二列为登录用户名
第三列为登录密码
第四列为设备名
第五列为设备类型(AC是思科的无线控制器,oldC是老款思科交换机,Cisco是常见的思科交换机)
第六列为设备enable密码

创建脚本

运行

nano /backup/switch_backup.sh

将如下脚本贴入保存,或者可以用SFTP等工具直接上传到linux系统内
此脚本将配置保存到"/backup/当前日期"目录下面

#!/bin/bash

#取时间戳
BACKUP_DATA=`date +%Y%m%d`
#创建时间戳的备份目录
mkdir -p /backup/$BACKUP_DATA


#账号密码及IP地址存放在swlist(IP地址、账号、密码、主机名、Flag、enable密码),通过awk获取所有IP并存放在数组IPADDR
IPADDR=(`cat /backup/swlist | grep '^[1-9]' | awk '{print $1}'`)


#for循环,取出所有ip地址复制ipaddr
for ipaddr in ${IPADDR[@]}
do
    #输出备份开始时间戳
    echo "`date +%H:%M:%S` 开始备份:$ipaddr"
    #取出相应交换机的账号、密码、主机名
    USERNAME=(`cat /backup/swlist | grep -w "$ipaddr" | awk '{print $2}'`)
    PASSWORD=(`cat /backup/swlist | grep -w "$ipaddr" | awk '{print $3}'`)
    SYSNAME=(`cat /backup/swlist | grep -w "$ipaddr" | awk '{print $4}'`)
    Flag=(`cat /backup/swlist | grep -w "$ipaddr" | awk '{print $5}'`)

    case $Flag in
                HW|H3C)
            /usr/bin/expect >> /dev/null << EOF
                set timeout 20
                log_file /backup/$BACKUP_DATA/$SYSNAME-$ipaddr.cfg
                spawn ssh $USERNAME@$ipaddr
                expect {
                   "yes/no" { send "yes\n";exp_continue }
                   "assword" { send "$PASSWORD\n" }
                }
                expect "*>"
                send "\r display current-configuration \r"

                while (1) {
                expect {
                   "*---- More ----"{ send "  " }
                   "return" { break }
                }
                }
                expect "*>"
                        send "\r"
                        expect "*>"

                send "display clock\r"
                expect "*>"
                send "quit\r"
EOF
;;

                RJ|Cisco)
            EnablePW=(`cat /backup/swlist | grep -w "$ipaddr" | awk '{print $6}'`)

            /usr/bin/expect >> /dev/null << EOF
                set timeout 10
                log_file /backup/$BACKUP_DATA/$SYSNAME-$ipaddr.cfg
                spawn ssh -oKexAlgorithms=+diffie-hellman-group-exchange-sha1 -oKexAlgorithms=+diffie-hellman-group14-sha1 -oKexAlgorithms=+diffie-hellman-group1-sha1 $USERNAME@$ipaddr
                expect {
                   "yes/no" { send "yes\n";exp_continue }
                   "assword" { send "$PASSWORD\n" }
                }
                expect "*>"
                send "enable\r"
                                expect "assword"
                                send "$EnablePW\r"
                expect "*#"
                send "\r terminal length 0\r"
                send "\r show running-config\r"

                while (1) {
                expect {
                    "*--More--" {send "  " }
                    "end" { break }
                }
                }
                expect "*#"
                send "\r"
                expect "*#"
                send "\r show clock detail\r"
                expect "*#"
                send "\r show ver\r"

                while (1) {
                expect {
                    "*--More--" {send "  " }
                    "end" { break }
                }
                }
                expect "*#"
                send "\r"
                send "exit\r"
EOF
;;

                oldC)
            EnablePW=(`cat /backup/swlist | grep -w "$ipaddr" | awk '{print $6}'`)

            /usr/bin/expect >> /dev/null << EOF
                set timeout 10
                log_file /backup/$BACKUP_DATA/$SYSNAME-$ipaddr.cfg
                spawn ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 $USERNAME@$ipaddr
                expect {
                   "yes/no" { send "yes\n";exp_continue }
                   "assword" { send "$PASSWORD\n" }
                }
                expect "*>"
                send "enable\r"
                                expect "assword"
                                send "$EnablePW\r"
                expect "*#"
                send "\r terminal length 0\r"
                send "\r show running-config\r"

                while (1) {
                expect {
                    "*--More--" {send "  " }
                    "end" { break }
                }
                }
                expect "*#"
                send "\r"
                expect "*#"
                send "show clock detail\r"
                expect "*#"
                send "\r show ver\r"

                while (1) {
                expect {
                    "*--More--" {send "  " }
                    "end" { break }
                }
                }
                expect "*#"
                send "\r"
                send "exit\r"
EOF
;;

                AC)
            EnablePW=(`cat /backup/swlist | grep -w "$ipaddr" | awk '{print $6}'`)

            /usr/bin/expect >> /dev/null << EOF
                set timeout 10
                log_file /backup/$BACKUP_DATA/$SYSNAME-$ipaddr.cfg
                spawn ssh $USERNAME@$ipaddr
                expect {
                   "yes/no" { send "yes\n";exp_continue }
                   "assword" { send "$PASSWORD\n" }
                }
                expect "*>"
                send "show run-config startup-commands\r"
                while (1) {
                expect {
                    "*--More--" {send " " }
                    "Config End" { break }
                }
                }
                expect "*>"
                send "\r"
                expect "*>"
                send "show time\r"
                expect "*>"
                send "logout\r"
                expect "y/N"
                send "n"
EOF
                ;;
                    *)
                            echo "Flag is wrong!(在swlist中最末尾字段Flag标记为"HW/RJ/H3C/Cisco/oldC/AC"."
                            ;;
    esac

    echo "`date +%H:%M:%S` 备份完成"
done

运行如下命令,赋予脚本执行权限.

chmod +x /backup/switch_backup.sh

此脚本使用expect自动交互实现配置导出,可按照实际命令交互情况修改脚本实现自定义功能。

创建计划任务,让脚本定时运行

运行 crontab -e
将如下示例内容贴入并保存退出即可,示例内容定义为每天5:15运行脚本,将日志输出到/backup/logs/当前日期.log中保存

15 5 * * * /backup/switch_backup.sh > /backup/logs/$(date +"\%Y-\%m-\%d").log 2>&1
*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期几 (0 - 6) (星期天 为0)
|    |    |    +---------- 月份 (1 - 12) 
|    |    +--------------- 一个月中的第几天 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

示例:
执行时间     格式
每分钟定时执行一次     * * * * *
每小时定时执行一次     0 * * * *
每天定时执行一次     0 0 * * *
每周定时执行一次     0 0 * * 0
每月定时执行一次     0 0 1 * *
每月最后一天定时执行一次     0 0 L * *
每年定时执行一次     0 0 1 1 *

标签: none

添加新评论