交换机配置自动备份脚本
脚本作用:自动定期备份网络设备配置
支持的设备: 华为(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 *