巧用批处理查找端口
2016-11-26
引言:批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言。批处理程序虽然是在命令行环境中运行,但不仅仅能使用命令行软件,任何当前系统下可运行的程序都可以放在批处理文件中运行。
作者所在单位要部署一套温湿度监控系统。该系统由华图S400W无线温湿度记录仪、HE2400无线基站和监控软件组成。一个或多个无线温湿度记录仪探测环境温湿度,通过RF射频传送给该环境中的无线基站,无线基站经有线或无线局域网将监测数据通过UDP协议传送至监控服务器。客户端通过B/S结构可查看温湿度记录,接收报警。
该系统有40多个无线基站接入到二层交换机,局域网为核心、接入两层结构,接入层交换机有30多台,按部门划分了30多个VLAN,为管理方便,部署中需将所有的无线基站划归同一VLAN。如果手工为所有无线基站调整VLAN、分配固定IP,工作量庞大,因此想用批处理来实现。
实现思路
图1 网络拓扑图
首先:每个无线基站均有MAC地址,先统一把所有无线基站逐一连接笔记本电脑,预先设置好固定IP,192.168.31.0/24网段,并记录下其MAC地址;
然后,将所有无线基站部署到各监测点,开机;
最后,在局域网中一台电脑上运行批处理程序,输入MAC地址,即可找到该基站所连接的交换机端口,将端口划至VLAN 31。
批处理中需先Telnet至核心交换机,查找指定MAC所直连的二层交换机,再Telnet至二层交换机,找到该MAC所连接的端口,并修改端口的VLAN号。然而批处理在使用Telnet时无法自动输入Telnet登录密码,而VBscript脚本使用SendKeys命令能做到,因此若把二者结合使用,就能达到想要的效果。网络拓扑如图1所示。
FindMac.bat批处理内容如下:
@rem 第一步:输入MAC地址,Telnet核心交换机查找该MAC所连接的核心交换机端口
@set /p mymac=请输入要查找的MAC:
@del c: elcore.vbs
@echo on error resumenext >>c: elcore.vbs
@echo dim WshShe ll>>c: elcore.vbs
@echo Set WshSh ell=WScript.CreateObje ct("WScript.Shell")>>c: elcore.vbs
@echo WshShell.run"c md">>c: elcore.vbs
@echo WshShell.App Activate"c:windowssys tem32cmd.exe">>c: elc ore.vbs
@echo WScript.Sleep 200>>c: elcore.vbs
@echo WshShell.SendKeys"telnet 192.16 8.1.254{ENTER}">>c: elcore.vbs
@echo WScript.Sleep 100>>c: elcore.vbs
@echo WshShell.AppActivate"telnet.exe">>c: elcore.vbs
@echo WScript.Sleep 2000>>c: elcore.vbs
@echo WshShell.SendKey s"jikon {ENT ER}">>c: elcore.vbs
@echo WScript.Sleep 2000>>c: elcore.vbs
@echo WshShell.Send Keys"sh mac add add %m ymac%{ENTER}">>c: elcore.vbs
@echo WScript.Sleep 1000>>c: elcore.vbs
@echo WshShell.SendKeys"sh cdp nei{ENT ER}">>c: elcore.vbs
@echo WScript.Sleep 1000>>c: elcore.vbs
@call c: elcore.vbs
@rem 第二步:输入二层交换机的管理IP,查找该MAC所连接的二层交换机端口
@cls
@set /p sw=请输入该MAC所连接的二层交换机IP:
@del c: elsw.vbs
@echo on error resumenext >>c: elsw.vbs
@echo dim WshSh ell>>c: elsw.vbs
@echo Set WshSh ell= WScript.CreateObject("WScript.Shell")>>c: e lsw.vbs
@echo WshShell.ru n"cmd">>c: elsw.vbs
@echo WshShell.App Activate"c:windowssy stem32cmd.exe">>c: elsw.vbs
@echo WScript.Sleep 200>>c: elsw.vbs
@echo WshShell.Send Keys"telnet %sw%{EN TER}">>c: elsw.vbs
@echo WScript.Sleep 100>>c: elsw.vbs
@echo WshShell.App Activate"telnet.exe ">>c: elsw.vbs
@echo WScript.Sleep 2000>>c: elsw.vbs
@echo WshShell.SendKeys"jikong{EN TE R}">>c: elsw.vbs
@echo WScript.Sleep 2000>>c: elsw.vbs
@echo WshShell.SendKeys"sh mac addadd%mymac%{ENTER}">>c: elsw.vbs
@echo WScript.Sleep 1000>>c: elsw.vbs
@echo WshShell.SendKeys"sh cdp nei{EN TER}">>c: elsw.vbs
@echo WScript.Sleep 1000>>c: elsw.vbs
@call c: elsw.vbs
@rem 第三步:输入二层交换机的管理IP,查找该MAC直连的二层交换机端口
@cls
@set /p swzl=请输入该MAC所直连的二层交换机IP:
@del c: elswzl.vbs
@echoon error resume next >>c: elswzl.vbs
@echodim WshShell>>c: elswzl.vbs
@echo Set WshSh ell= WScript.CreateObject("WScript.Shell")>>c: elswzl.vbs
@echo WshShell.run"cmd">>c: elswzl.vbs
@echo WshShell.App Activate"c:windowssys tem32cmd.exe">>c: elswzl.vbs
@echo WScript.Sleep 200>>c: elswzl.vbs
@echo WshShell.SendKeys"telnet %swz l%{ENTER}">>c: elsw zl.vbs
@echo WScript.Sleep 100>>c: elswzl.vbs
@echo WshShell.AppActivate"telnet.exe">>c: elswzl.vbs
@echo WScript.Sleep 2000>>c: elswzl.vbs
@echo WshShell.SendKeys"jik ong{ENT ER}">>c: elswzl.vbs
@echo WScript.Sleep 2000>>c: elswzl.vbs
@echo WshShell.Sen dKeys"sh mac add add%mymac%{ENTER}">>c: elswzl.vbs
@echo WScript.Sleep 1000>>c: elswzl.vbs
@call c: elswzl.vbs
@rem 第四步:输入二层交换机端口号,修改VLAN
@cls
@set /p swzldk=请输入该MAC所直连的二层交换机端口号:
@del c: elswzldk.vbs
@echo on error resume next >>c: elswzldk.vbs
@echo dim WshShell>>c: elswzldk.vbs
@echo Set WshShell=WScript.Creat eObj ec t("WScript.Shell")> >c: elswzldk.vbs
@echo WshShell.run"cmd">>c: elswzldk.vbs
@echo WshShell.App Activate"c:windowssys tem32cmd.exe">>c: elswzldk.vbs
@echo WScript.Sleep 200>>c: elswzldk.vbs
@echo WshShell.SendKeys"telnet %swzl%{ENTER}">>c: elswzl dk.vbs
@echo WScript.Sleep 100>>c: elswzldk.vbs
@echo WshShell.AppActivate"telnet.exe">>c: elswzldk.vbs
@echo WScript.Sleep 2000>>c: elswzldk.vbs
@echo WshShell.SendKeys"jikong{EN TER}">>c: elswzldk.vbs
@echo WScript.Sleep 2000>>c: elswzldk.vbs
@echo WshShell.SendKeys"en{ENTER}">>c: elswzldk.vbs
@echo WScript.Sleep 1000>>c: elswzldk.vbs
@echo Wsh Shell.SendKeys "jikong{EN TER}">>c: elswzldk.vbs
@echo WSc ript.Sleep 2000>>c: elswzldk.vbs
@echo WshShell.SendKeys"conf t{ENT ER}">>c: elswzldk.vbs
@echo WSc ript.Sleep 1000>>c: elswzldk.vbs
@echo Wsh Sh ell.SendKeys"int f0/%swzld k%{ENTER}">>c: elswzldk.vbs
@echo WScript.Sleep 1000>>c: elswzldk.vbs
@echo WshShell.SendKeys"swit acce vlan 31{ENTER}">>c: elswzldk.vbs
@echo WScript.Sleep 1000>>c: elswzldk.vbs
@echo WshShell.SendKeys"no shut{EN TER}">>c: elswzldk.vbs
@echo WScript.Sleep 1000>>c: elswzldk.vbs
@echo WshShell.SendKeys"end{ENTER}">>c: elswzldk.vbs
@echo WScript.Sleep 1000>>c: elswzldk.vbs
@echo WshShell.SendKeys"wr{ENTER}">>c: elswzl dk.vbs
@echo WScript.Sleep 1000>>c: elswzldk.vbs
@call c: elswzldk.vbs
@rem 清除所定义的变量
@set mymac=
@set sw=
@set swzl=
@set swzldk=
批处理运行过程的解释:
图2 输入MAC地址
图3 核心交换机连接拓扑
图4 输入二层交换机IP地址
图5 二层交换机连接拓扑
图6 输入直连的二层交换机IP地址
第一步:定义变量mymac,让用户从键盘输入无线基站的MAC地址,将第一段代码追加到telcore.vbs文件并调用,即Telnet核心交换机192.168.1.254,查找该MAC所连接的核心交换机端口。
拓扑中显示核心交换机通过光纤连接了9台二层交换机,该MAC地址连接在Gi3/1端口所连接的二层交换机上,该二层交换机名称是Z2FN1,对telswzl.vbs的调用完成。用户查找交换机hostname命名表,找到Z2FN1的IP是192.168.1.201。
第二步:定义变量sw,让用户从键盘输入二层交换机Z2FN1的管理IP地址192.168.1.201,将第二段代码追加到telsw.vbs文件并调用,即Telnet二层交换机 192.168.1.201,查找该MAC所连接的二层交换机端口。
拓扑中显示二层交换机Z2FN1共连接了3台交换机机,即Gi0/1口通过光纤连接核心交换机、GI0/2千兆电口连接二层交换机Z2FN2、百兆电口Fa0/46连接二层交换机Z2FD1。该MAC地址连接在Gi0/2端口所连接的二层交换机上,该二层交换机名称是Z2FN2,对telsw.vbs的调用完成。用户查找交换机hostname命名表,找到Z2FN2的IP是192.168.1.202。
第三步:定义变量swzl,让用户从键盘输入二层交换机Z2FN2的管理IP地址192.168.1.202,将第三段代码追加到telswzl.vbs文件并调用,即Telnet二层交换机 192.168.1.202,查找该MAC直连的二层交换机端口。
显示该无线基站连接在192.168.1.202这台二层交换机的Fa0/8百兆电口上,对telswzl.vbs的调用完成。
图7 找到端口号
图8 输入端口号
图9 将端口加入VLAN31
第四步:定义变量swzldk,让用户从键盘输入端口号8,将第四段代码追加到telswzldk.vbs文件并调用,将端口加入VLAN 31,启用端口并保存。
最后,删除所定义的4个变量。至此批处理结束。
如果网络拓扑为核心层、汇聚层、接入层的三层结构,此过程还要增加一个步骤。显然,该批处理还不够智能化,最理想的结果是用户只需输入MAC地址,所有的工作自动完成,因此尚需进一步优化,而其复杂度和代码量将大大增加。