#!/usr/bin/bash
#下面这个文件路径是保存交换机信息的,位置如(交换机类型sc\hw\bd,登陆交换机管理用户,
#登陆交换机管理密码,交换机的IP,备份名,tftp服务器的IP)
swinfoo="./swconifgs/sw.config"
#while循环读取文件里的内容给到swinfo用awk分隔符,来取出需要的值 ,附加内容:其实这里用的内传参数,
#也可以用外参形式 要用到expect.exp(参数1,参数2,...),里面接收的时候为($argv[0],$argv[1],......)
while read swinfo;do
baktime=`date +%Y%m%d`
swtype=`echo $swinfo|xargs|awk -F',' '{print $1}'`
telnetname=`echo $swinfo|xargs|awk -F',' '{print $2}'`
telnetpw=`echo $swinfo|xargs|awk -F',' '{print $3}'`
telnetip=`echo $swinfo|xargs|awk -F',' '{print $4}'`
bakname=`echo $swinfo|xargs|awk -F',' '{print $5}'`"_"$telnetip"_"$baktime
tftpip=`echo $swinfo|xargs|awk -F',' '{print $6}'`
(
#加case条件判断变量交换机属什么类型(是思科还是华为.......) *代表默认 注意最后格式是 每个后面加两;即;;还有最后 esca
case $swtype in
sc)
#用expect进行自动交互 spawn启动交互命令 expect得到输入关键位(需要模拟一次才更清楚而清晰) send发送变量 \r回车
/usr/bin/expect<<EOF
spawn telnet $telnetip
expect "Username:"
send "$telnetname\r"
expect "Password:"
send "$telnetpw\r"
#下面是备份思科交换机的命令
send "copy run tftp:\r"
send "$tftpip\r"
send "$bakname\r"
send "! ############################\r"
send "exit\r"
#注意格式,结束eof
expect eof
EOF
#两个;是case语句的分支结点
;;
hw)
/usr/bin/expect<<EOF
spawn telnet $telnetip
expect "Username:"
send "$telnetname\r"
expect "Password:"
send "$telnetpw\r"
#下面是华为交换机的配置备份命令
send "tftp $tftpip put vrpcfg.zip $bakname\r"
send "! ######################################\r"
send "quit\r"
expect eof
EOF
;;
bd)
/usr/bin/expect<<EOF
spawn telnet $telnetip
#北电交换机比较特殊,需要等待1秒 ,出现图形化选择操作的界面后发送ctrl+y
sleep 1
#这里就是向控制端发送ctrl+y组合键的Acsll码的八进制值
#查询请到:https://blog.youkuaiyun.com/iodoo/article/details/49175749
send "\031"
sleep 1
#按北电配置备份下一步发送有下划线的字母,配置是C,所以发送C键的Acsll码的八进制
send "\143"
sleep 1
#进入特权模式
send "en\r"
#北电备份配置的命令
send "copy running-config tftp address $tftpip filename $bakname\r"
sleep 20
send "exit\r"
sleep 1
#北电图形界面按L退出
send "\154"
send "! #######################################\r"
expect eof
EOF
;;
*)
echo "fail"
esac
#追加备份日志tee -a的作用是追加
)|tee -a ./log/swbak.log
#把交换机配置信息交到swinfo作为变量读取
done < $swinfoo
exit 0