SecureCRT脚本编写方法
一、 SecureCRT工具常用到的几个函数阐述如下:
在 SecureCRT里,用得最多的应该就是 crt.Screen,基本上很多操作都是基于屏幕的返回字来决定下
一步该作何操作:
第一: crt.Screen.WaitForString("KeyString",timewaiting) 
该函数是单字符串判断, KeyString 是需要查找的关键字, timewaiting 是一个超时阀值,例如:
crt.Screen.WaitForString("people:",5)该行代码的意思就是在 5 秒内没有检测到 people:出现,就执行下
一条语句,如果改成: crt.Screen.WaitForString("people:")那就是指直到 people:出现才执行下一行代码
WaitForString 是有返回值的, 返回值是 True或者 False 因此,可以根据返回值进行条件判断以确定一
下条代码 例如:
If(crt.Screen.WaitForString("currentstate:UP",1)<>False)Then 
portStatus="PortUP" 
Else 
portStatus="PortDown" 
EndIf 
msgboxportStatus 
这段代码用于判断端口状态情况并记录下来 . 
第二: crt.Screen.WaitForStrings("KeyString1","KeyString2",...,timeout) 
用于多个字符串的判断, timeout 的作用是一样的 例如:
crt.Screen.WaitForStrings("cisco","huawei","H3C",5) 
意思就是在 5 秒内有检测到相应的字符时,返回相应的索引号 (索引号是从 1 开始的) 如果都没有检
查到,则返回 0.因此,该函数的使用可以如下:
Dim SwitchKey 
SwitchKey=crt.Screen.WaitForStrings("cisco","huawei","H3C",5) 
Select case SwitchKey 
case 1 
MsgBox"思科设备 " 
case 2 
MsgBox"华为设备 " 
case 3 
MsgBox"华三设备 " 
case else 
MsgBox"未知设备 " 
End Select 
几个对话性的函数
其实 SecureCRT支持的脚本语言就是 VBS,这个脚本语言与 VB 有较大的不同,对于界面的支持性较
差 不过也有几个对话性的函数
1、InputBox:提示用户输入参数
temp=inputbox(" 提示用户你输入参数的名称 "," 对话框的名称 "):需要将输入的参数赋值给某一个参数
进行使用
2、输出函数 msgbox 
msgbox“给用户输出的信息对话框”
eg.求正方形面积的脚本
dimr,s 
r=inputbox("请输入正方形的边长 :"," 求正方形面积的程序 ") 
s=r*r 
msgbox(s) 
巡检代码示例
下面就我的工作性质 ,跟我同事一块制作的一个脚本程序——维护着 N 台路由器设备,每天需要对这
些设备进行例行巡检 下面是程序的所有代码,希望对各位有所帮助
***************************************************************************************
******************* 
***************************************************************************************
******************* 
#$language="VBScript" 
#$interface="1.0" 
'说明:
'本代码可在 CRT工具中实现 Cosico,华为,爱立信路由器交换机数据的自动配置或作为设备巡检之
用;
Setscreen=crt.Screen'创建屏幕对象
'定义全局变量:
'Device 变量为操作设备对象数组,作为存储设备名用;
'CiscoAggreOfCommands变量为思科设备命令集合数组,作为存储思科设备命令用;
'NE40EAggreOfCommands变量为华为 NE40E设备命令集数组,作为存储华为 NE设备命令用;
'SE800AggreOfCommands变量为爱立信 SE800设备命令集数组,作为存储爱立信 SE800设备命令用;
'ArrreOfRiskCommands变量为各厂家设备存在风险性操作命令的数组,作为存储过滤风险操作命令之
用;
'DeviceNumth 变量为 Device数组序号;
'CommandNumth 变量为各厂家命令数组的序号;
'ResultOfType变量为判断设备类型标识符;
'TypeOfCommand变量作为存储当前命令类型用;
DimDevice,CiscoAggreOfCommands,NE40EAggreOfCommands,SE800AggreOfCommands,ArrreOfRiskComm
ands 
DimDeviceNumth,CommandNumth,ResultOfType 
DimTypeOfCommand 
'爱立信设备集合
'Device=Array("CE35-ERICSE800","CE36-ERICSE800","CE37-ERICSE800","CE38-ERICSE800") 
'华为设备集合
Device=Array("CE07-HWNE40E","CE08-HWNE40E",_ 
"CE09-HWNE40E","CE10-HWNE40E",_ 
"CE11-HWNE40E","CE12-HWNE40E",_ 
"CE21-HWNE40E","CE22-HWNE40E",_ 
"CE23-HWNE40E","CE24-HWNE40E",_ 
"CE25-HWNE40E","CE26-HWNE40E",_ 
"CE29-HWNE40E","CE30-HWNE40E",_ 
"CE33-HWNE40E","CE34-HWNE40E",_ 
"CE45-HWNE40E","CE46-HWNE40E",_ 
"CE47-HWNE40E","CE48-HWNE40E",_ 
"CE49-HWNE40E","CE50-HWNE40E") 
'思科设备命令集合
CiscoAggreOfCommands=Array("showcdp",_ 
"showconf",_ 
"showhard",_ 
"showinterface",_ 
"showiproute",_ 
"showconf") 
'华为 NE40E设备命令集合
'健康检查
'告警检查
'日志检查
'单板运行状态检查
'CPU占用率检查
'内存占用率检查
'接口和链路状态以及流量检查
'NE40E接口状态检查
'OSPF邻居状态检查
'路由信息检查
NE40EAggreOfCommands=Array("displayhealth",_ 
"displaytrapbuffer",_ 
"displaylogbuffer",_ 
"displaydevice",_ 
"displaycpu-usage",_ 
"displaymemory-usage",_ 
"displayinterface",_ 
"disospfpeer",_ 
"displayiprouting-table") 
'爱立信 SE800设备命令集合
'单板注册信息
'办卡加电自检
'单板运行状态检查
'检查背板运行状态
'检查主控板冗余性
'存储设备利用率
'CPU利用率
'内存利用率检查
'端口运行状态检查
'端口数据收发状态检查
'电源使用情况检查
'检查 OSPF状态
SE800AggreOfCommands=Array("showchassis",_ 
"showdiagon-demanddetail",_ 
"showhardware",_ 
"showbackplane-status",_ 
"showredundancy",_ 
"showdisk",_ 
"showprocess",_ 
"showmemory",_ 
"showportdetail",_ 
"showportcountersdetail",_ 
"showchassispower",_ 
"contextChinaMobile_NGN_SG",_ 
"showospfneighbor",_ 
"contextChinaMobile_NGN_Media",_ 
"showospfneighbor") 
'风险命令过滤集合
ArreOfRiskCommands=Array("reb","rel") 
'CE汇聚网管平台登陆子函数
FunctionLandIPNET 
screen.Send""&chr(13) 
screen.WaitForString"ogin:" 
screen.Send"XXXXXXXXXX"&chr(13) 
screen.WaitForString"Password:" 
screen.Send"XXXXXXXXXX"&chr(13) 
EndFunction 
'各厂家设备选择登陆子函数
FunctionLandDevice 
screen.Send""&chr(13) 
screen.WaitForString"Console>>" 
screen.Send"open"&Device(DeviceNumth) 
ResultOfType=screen.WaitForStrings("Cisco","NE40E","SE800",4) 
IfResultOfType=1Then 
TypeOfCommand=CiscoAggreOfCommands 
'CommandNumth=0 
ElseIfResultOfType=2Then 
TypeOfCommand=NE40EAggreOfCommands 
'CommandNumth=0 
ElseIfResultOfType=3Then 
TypeOfCommand=SE800AggreOfCommands 
'CommandNumth=0 
Else 
MsgBox"ErrorTypeOfDevice" 
Do 
Loop 
EndIf 
screen.Send""&chr(13) 
screen.WaitForStrings"Username:","ogin:" 
screen.send"XXXXXXXXXX"&chr(13) 
screen.WaitForString"Password:" 
screen.Send"XXXXXXXXXX"&chr(13) 
Do 
LoopUntil(screen.WaitForStrings("NE40E>","SE800#",5)<>False) 
EndFunction 
'退出设备子函数
FunctionExitDevice 
IfResultOfType=1Then 
ElseIfResultOfType=2Then 
screen.Send""&"quit"&chr(13) 
Do 
screen.Send""&chr(13) 
LoopUntil(screen.WaitForString("Console>>",1)<>False) 
ElseIfResultOfType=3Then 
screen.Send""&"exit"&chr(13) 
Do 
screen.Send""&chr(13) 
LoopUntil(screen.WaitForString("Console>>",1)<>False) 
Else 
EndIf 
EndFunction 
FunctionShowAll 
Dowhile(screen.WaitForStrings("More","more",3)<>False) 
crt.Screen.Send"" 
Loop 
EndFunction 
'风险命令过滤子函数
FunctionRiskCommands 
Dimresult 
result=screen.WaitForStrings(ArreOfRiskCommands,1) 
Ifresult<>FalseThen 
MsgBox"Thecommandyouareimportingexistsrisk!" 
Do 
Loop 
EndIf 
EndFunction 
SubMain 
crt.Screen.Synchronous=True 
LandIPNET 
ForDeviceNumth=LBound(Device)ToUBound(Device) 
LandDevice 
CommandNumth=0 
ForCommandNumth=LBound(TypeOfCommand)ToUBound(TypeOfCommand) 
screen.Send""&TypeOfCommand(CommandNumth) 
RiskCommands 
screen.Send""&chr(13) 
ShowAll 
Ifscreen.WaitForString("More",1)<>FalseThenShowAll 
crt.Sleep4000 
screen.Send""&chr(13) 
Next 
ExitDevice 
Next 
crt.Screen.Synchronous=False 
EndSub 
二、 自动化脚本编写
三段模式模板
从一个文件(目录为 C:\Users\lilf\Desktop\ip.txt )里面自动读取设备 IP 地址,密码等,自动登录设备
进入特权模式
第一种情况:用户名 +密码 +特权密码方式
”)
ip.txt ”,Forreading, False)
“Scripting.FileSystemObject
# $language =  “VBScript ”
# $interface =  “1.0″
Sub Main 
‘打开保存设备管理地址以及密码的文件
Const ForReading = 1, ForWriting = 2, ForAppending = 8 
Dim fso,file1,line,params 
Set fso = CreateObject(
Set file1 = fso.OpenTextFile( “C:
crt.Screen.Synchronous = True 
DO While file1.AtEndOfStream <> True 
‘读出每行
line = file1.ReadLine 
‘分离每行的参数 IP地址 用户名 密码 特权密码
params = Split (line) 
‘Telnet到这个设备上
crt.Session.Connect (
‘输入 telnet 用户名和密码
crt.Screen.WaitForString 
crt.Screen.Send params(1) & vbcr 
crt.Screen.WaitForString 
crt.Screen.Send params(2) & vbcr 
‘进特权模式
crt.Screen.Send  “enable ” & vbcr
‘输入特权密码
crt.Screen.WaitForString 
crt.Screen.Send params(3) & vbcr 
crt.Screen.waitForString 
ip.txt 里相对应的 IP 地址、用户名、密码、特权密码,分别如下:
192.168.1.1 admin ruijie ruijie 
192.168.1.2 admin ruijie ruijie 
192.168.2.1 admin ruijie ruijie 
,,
“/TELNET ” & params(0))
“sername: ”
“assword: ”
“assword: ”
“#”
“Scripting.FileSystemObject
”)
“C:
ip.txt ”,Forreading, False)
第二种情况:密码 +特权密码方式
# $language =  “VBScript ”
# $interface =  “1.0″
Sub Main 
‘打开保存设备管理地址以及密码的文件
Const ForReading = 1, ForWriting = 2, ForAppending = 8 
Dim fso,file1,line,params 
Set fso = CreateObject(
Set file1 = fso.OpenTextFile(
crt.Screen.Synchronous = True 
DO While file1.AtEndOfStream <> True 
‘读出每行
line = file1.ReadLine 
‘分离每行的参数 IP地址 密码 特权密码
params = Split (line) 
‘Telnet到这个设备上
crt.Session.Connect (
‘输入 telnet 密码
crt.Screen.WaitForString 
crt.Screen.Send params(1) & vbcr 
‘进特权模式
crt.Screen.Send  “enable ” & vbcr
‘输入特权密码
crt.Screen.WaitForString 
crt.Screen.Send params(2) & vbcr 
crt.Screen.waitForString 
ip.txt 里相对应的 IP 地址、密码、特权密码,分别如下:
192.168.1.1 admin ruijie 
192.168.1.2 admin ruijie 
192.168.2.1 admin ruijie 
,,
“/TELNET ” & params(0))
“assword: ”
“assword: ”
“#”
脚本发送命令:
// 这个是回车,并且每行只发送一个命令
“(config)# ”
“(config)# ”
crt.Screen.Send”要发送的命令” & chr(13) 
如下,进入全局模式下,去掉 OSPF进程号 800 
crt.Screen.Send  “conf t ” & chr(13)
crt.Screen.WaitForString 
crt.Screen.Send “no router ospf 800″ & chr(13) 
crt.Screen.WaitForString 
crt.Screen.Send  “end” &
 chr(13) 
crt.Screen.WaitForString 
“#”
crt.Screen.Send  “wr” & chr(13)
J 
录制好的,复制那些相关的命令 这样不用自己逐条手写了
完成一台设备的操作之后,退出并进入下一台设备
‘完成后退出
crt.Screen.waitForString “#”,3 
crt.Session.Disconnect 
// 等待 3S后如果没有其它操作,则自动断开
这样去写是相当困难的,所以我们可以用先录制好需要进行相关操作的脚本,打开那个
loop 
crt.Screen.Synchronous = False 
End Sub 
三、 应用案例
真实场景:
“C:
“Scripting.FileSystemObject
”)
“/TELNET ” & params(0)
ip.txt  “,Forreading, False)
客户升级,客户有 145 台设备需要升级,其中有 rgos.bin,也有少部分的 rgnos.bin 
首先查找当前运行的是 rgos.bin 还是 rgnos.bin 
运行脚本,并记录日志到一个文本中,按 2.1.2 图即可
脚本如下:
# $language =  “VBScript ”
# $interface =  “1.0″
Sub Main 
Const ForReading = 1, ForWriting = 2, ForAppending = 8 
Dim fso,file1,line,params 
Set fso = CreateObject(
Set file1 = fso.OpenTextFile(
crt.Screen.Synchronous = True 
DO While file1.AtEndOfStream <> True 
line = file1.ReadLine 
params = Split (line) 
crt.Session.Connect 
crt.Screen.WaitForString 
crt.Screen.Send params(1) & vbcr 
crt.Screen.WaitForString 
crt.Screen.Send params(2) & vbcr 
crt.Screen.Send  “enable ” & vbcr
crt.Screen.waitForString 
crt.Screen.Send  “show ver ” & vbcr
crt.Screen.WaitForString 
crt.Screen.Send vbcr 
crt.Screen.waitForString 
crt.Session.Disconnect 
loop 
crt.Screen.Synchronous = False 
End Sub 
C:\Users\lilf\Desktop\ip.txt 中的内容如下
10.243.124.1 XXXX XXXX 
10.243.124.10 XXXX XXXX 
完成 show  ver 后,查看日记记录,找到当前运行的是 rgnos.bin 设备,并把他的 IP 地址从 ip.txt 中去
掉,新建 ip1.txt 
升级 rgos.bin:
# $language =  “VBScript ”
# $interface =  “1.0″
Sub Main 
Const ForReading = 1, ForWriting = 2, ForAppending = 8 
Dim fso,file1,line,params 
“#”
“#”,3
“sername: ”
“assword: ”
“#”