shell脚本操作交换机_expect脚本实现交换机批量配置
整理⼀下现状:1.交换机都处于专⽹中,笔者的服务器均可以直接访问,⽆需代理设备;2.⼏乎所有的交换机型号相同,也就是说完成ntp 的配置指令相同;3.所有交换机密码相同;4.所有设备都可以telnet管理,端⼝均是默认端⼝,唯⼀的区别就只有设备IP地址。
那笔者的思路就⽐较清楚了,⾸先有个指令配置的模板,其中包含了设备登陆、密码输⼊、配置指令及保存退出。其次定义⼀个IP地址的表单,对表单内的IP地址进⾏配置模板的重复执⾏。
对于linux系统⽽已,⼤多数简短脚本都会采⽤bash来进⾏编写,⽽笔者之前尝试过expect脚本编写,感觉这个脚本语⾔对于初学者相对⽐较友好,因此这节笔者就通过expect来进⾏功能实现。
登陆服务器,⾸先看⼀下服务器是否有bash和expect:
yum list installed | grep bash
yum list installed | grep expect
看到系统是⾃带bash组件,但没有expect,继续按照以往的⽅式进⾏软件安装:
yum list | grep expect
yum install expect.x86_64
完成软件安装。
查看⼀下yum把expect安装到了哪⾥:
whereis expect
熟悉⼀下⽂件安装的路径。
下⾯笔者开始⼀个初始化脚本的编写,进⼊⽂件夹
cd /var
笔者来新建⼀个⽂件夹⽤于储存和管理脚本
mkdir expect
进⼊笔者新建的⽂件夹
cd ./expect
开始创建第⼀个shell⽂件
vi telnet.sh
编程语⾔第⼀步就是声明语⾔,结合之前笔者看到的安装路径:
#!/usr/bin/expect
设置超时时间为3秒:
set timeout 3
继续随便⼀台交换机进⾏测试:⽐如10.150.103.61,测试之前呢,笔者也先不拿ntp的相关配置来做操作,毕竟时间看起来⽐较⿇烦。笔者⽤最简单、直观可见的⽅式--修改交换机的名称来测试:
插⼊⼀部分,编程的同时笔者先梳理⼀下交换机改名字的配置思路。
第⼀步telnet 10.150.103.61
执⾏之后呢,交换机就需要输⼊密码,为了⽅便测试脚本笔者改为了简单好记的123456
输⼊密码之后呢,H3C交换机改个⽤户名两条简单指令:
system-view
sysname hbaitest1
保存退出:
quit
save
y
y
最后quit退出,就结束了~
如上交换机的配置指令已经梳理清楚了,那就开始脚本配置:
脚本配置的轻松愉快啊,spawn即是执⾏了telnet的指令,之后expect会匹配密码的输⼊,完整匹配字符应该是“Password:”前后两个*表⽰字符“assword”前后匹配任意字符,这样就匹配到了输⼊密码的界⾯。
后⾯的异常轻松,送密码啊送指令啊,送完了之后interact脚本结束。
wq!
保存退出,下⾯笔者迫不及待的尝试⼀下脚本的效果,运⾏之前笔者先登录这台交换机设备,把它修改为原来的名字:hbai1
切换回服务器,执⾏脚本。linux循环执行命令脚本
./telnet.sh
提⽰权限不够。直接给⽂件夹/var/expect赋予读写执⾏权限
chmod –R 777 /var/expect
继续运⾏脚本
./telnet.sh
再看⼀下交换机,名字已然变成了笔者修改过后的新名字。简简单单的脚本执⾏完成了。
执⾏完成后继续把名字修改回来:
笔者最初的⽬的达成了,可以通过脚本⾃动修改交换机名称,但是由于脚本是固定的IP地址(spawn tel
net 10.150.103.61)⽆法做到修改多个设备。下⼀步,笔者就在上述脚本的基础上进⾏优化设置。
⼀、增加输⼊,使得IP地址不再固定;
常见脚本的输⼊⽅式⼤约分为两种,⼀种是交互式的,可以⼿动输⼊,不过⼀旦输⼊内容很多,输⼊变量也会变成⼀件⾮常繁琐的事情;另⼀种⽅便的⽅式就是新建⼀个⽂件,把所有需要管理的IP地址都加⼊其中。然后⾃动读取⽂件执⾏就可以了。
很明显在笔者现有的应⽤场景下,第⼆种⽅式⽐较简便,笔者只需要把所有的交换机IP地址贴出来就可以了,思路上呢,就是⾸先读取⽂件第⼀⾏IP地址,telnet进⾏连接,执⾏交换机修改的命令;读取⽂件第⼆⾏IP地址…………直到读取⽂件结束。很清晰,⼀个循环操作。
⾸先笔者新建⼀个⽂件来存储IP地址:
输⼊⼏个测试的IP地址
笔者新建⼀个脚本来测试下循环:
vi read.sh
设置读取⽂件位置和操作:setf []
执⾏⼀个循环while:while {1}
读取字符串并写⼊line变量中set line [gets $f]
输出变量:puts “ipaddress is : $line”
判断变量是否为空,⽂件读取结束:    if {[eof $f]} {  close $f break  }
成功完成后输出提⽰:successful
这样⼀个简单的循环脚本就完成了,笔者执⾏⼀下脚本来看看运⾏结果:
.
/read.sh
不错~输⼊结束,结果很理想。下⾯笔者要做的就是整合之前完成的两个脚本,⼀边读取IP地址,⼀遍执⾏笔者想要的配置操作。
⼆、增加循环,使得脚本可以对多个设备执⾏命令。
回顾⼀下循环的思路:
1.读取⽂件;
2.执⾏循环;
3.读取字符串写⼊变量;
4.输出变量;
5.变量为空循环结束。
回顾⼀下交换机配置更改的思路:
1>telnet⼀个IP地址;2>在输⼊密码界⾯输⼊密码;3>执⾏命令;4>保存退出。
思路上就是将循环中的“4.输出变量”替换为“1>--4>交换机配置更改”,这样就轻松愉快的结束了。
开始操作,将循环脚本read.sh复制为modify.sh
cp read.sh modify.sh
编辑脚本:vi modify.sh
将第四条输出ip地址替换为telnet.sh脚本中的命令修改配置:
完整脚本如上。
个测试环境,笔者把ip.txt的地址替换为可以访问的交换机地址:
登陆这两台设备:
执⾏脚本:./modify.sh
等待脚本执⾏完成后,回到这两台交换机的管理界⾯,发现交换机名字已经批量修改了~
到这⾥为⽌,笔者的执⾏脚本已经完成啦,以后的批量作业只需要将指令保存到脚本之中,并且维护
交换机ip地址列表ip.txt就可以⼀键修改了~
可以看到,⼀个功能性脚本最重要的就是理清思路,知道分⼏步完成,每步该做什么;同样对于⼀个复杂的步骤可以将其拆解出来,单独使⽤⼀个脚本进⾏实现,最后再进⾏脚本的整合。每个复杂脚本基本上基于输⼊、输出、变量、运算符、注释、流控制来进⾏的,逻辑思路⾮常重要。
最后的最后,笔者优化⼀下了脚本。参考之前的ip地址列表,笔者将地址单独出了⼀个⽂件以便修改。同样,笔者将需要执⾏的命令也单独出来⼀个⽂件,命名为。考虑到笔者最初的⽬的,将配置指令修改为上⼀节NTP相关配置。三个⽂件如下所⽰:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。