expect备份交换机配置

因公司备份需求,需要对所有的交换机进行配置备份。由于涉及到ssh登录并交互,所以选定expect工具。

注意

1、expect使用log_file会记录下所有触发expect时的特殊控制字符,比如---- More ----^[[42D ^[[42D。vim不会解释这些特殊字符,cat和more则不影响。需要恢复时可以使用cat然后用CRT log session,或者用sed替换掉这些字符。

2、在循环判断“--More--”时,可能出现需要输入多个空格符合,或者输入“terminal  length 0”不暂停显示,华为和华三命令进入vty视图输入“screen-length 0”修改;

3、关于expect语句中的expect触发字符串,请根据各自交换机品牌型号进行调整,我这里备份的是华为的交换机

4、交换机量比较大的情况可以再写一个expect脚本首次登陆写入.ssh/knowhosts


整体脚本思路

1、用expect模拟登录交换机,并查看交换机配置,log_file记录交互过程,

2、采用文本存储交换机IP、账号、密码,变量赋值并循环

3、将所有的log_file按时间戳进行存档

4、为了日后监控备份过程,expect脚本备份配置的结尾加上一个标记来确定备份是否完成(我采用的是查看交换机时间信息 display clock)

5、设置计划任务,每天进行一次备份,并记录备份起止时间


脚本:

#!/bin/bash


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


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


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

case $Flag in
HW|H3C)
/usr/bin/expect>> /dev/null << EOF
set timeout20
log_file/backup/$BACKUP_DATA/$ipaddr-$SYSNAME
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/swhost | grep -w "$ipaddr" | awk '{print $6}'`)

/usr/bin/expect>> /dev/null << EOF
set timeout10
log_file/backup/$BACKUP_DATA/$ipaddr-$SYSNAME
spawn ssh$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\r"
expect"*#"
send"exit\r"
EOF
;;
*)
echo"Flag is wrong!(在swhost中最末尾字段Flag标记为"HW/RJ/H3C/Cisco"."
;;
esac

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

这里简单描述一下expect:设置超时10秒(SSH连接时有时反解比较慢,所以设长一点),设置log_file路径,起ssh进程(我们用统一账号做监控,所以我这里其实没有用变量的去保存用户名),然后模拟登录,查询当前交换机所有配置,这里起了一个死循环,只要检测到*--- More ----,就输出空格,直到查看完所有配置检测到return,最后再执行一个display clock,只是为了监控一下查看配置的过程是否有正常执行,,同时也是为了方便日后监控整个备份过程是否成功,不是必须的。


crontab

0 0 * * *   /backup/network_backup.sh > /backup/logs/$(date +"\%Y-\%m-\%d").log 2>&1


backup日志

[root@networkbackup backup]# cat logs/xxxx.xx.xx.log 

15:44:01  开始备份 x.x.x.x

15:44:13  备份完成

15:44:13  开始备份 x.x.x.x

15:44:17  备份完成

15:44:17  开始备份 x.x.x.x

15:44:20  备份完成

15:44:20  开始备份 x.x.x.x

15:44:32  备份完成

15:44:32  开始备份 x.x.x.x

15:44:34  备份完成

————————————————