2024年5月30日发(作者:)

SecureCRT脚本编写方法

一、 SecureCRT工具常用到的几个函数阐述如下:

在SecureCRT里,用得最多的应该就是,基本上很多操作都是基于屏幕的返回字来决定下

一步该作何操作:

第一:rString("KeyString",timewaiting)

该函数是单字符串判断,KeyString是需要查找的关键字,timewaiting是一个超时阀值,例如:

rString("people:",5)该行代码的意思就是在5秒内没有检测到people:出现,就执行下

一条语句,如果改成:rString("people:")那就是指直到people:出现才执行下一行代码

WaitForString是有返回值的,返回值是True或者False 因此,可以根据返回值进行条件判断以确定一

下条代码 例如:

If(rString("currentstate:UP",1)<>False)Then

portStatus="PortUP"

Else

portStatus="PortDown"

EndIf

msgboxportStatus

这段代码用于判断端口状态情况并记录下来.

第二:rStrings("KeyString1","KeyString2",...,timeout)

用于多个字符串的判断,timeout的作用是一样的 例如:

rStrings("cisco","huawei","H3C",5)

意思就是在5秒内有检测到相应的字符时,返回相应的索引号(索引号是从1开始的) 如果都没有检

查到,则返回0.因此,该函数的使用可以如下:

Dim SwitchKey

SwitchKey=rStrings("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='创建屏幕对象

'定义全局变量:

'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

""&chr(13)

rString"ogin:"

"XXXXXXXXXX"&chr(13)

rString"Password:"

"XXXXXXXXXX"&chr(13)

EndFunction

'各厂家设备选择登陆子函数

FunctionLandDevice

""&chr(13)

rString"Console>>"

"open"&Device(DeviceNumth)

ResultOfType=rStrings("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

""&chr(13)

rStrings"Username:","ogin:"

"XXXXXXXXXX"&chr(13)

rString"Password:"

"XXXXXXXXXX"&chr(13)

Do

LoopUntil(rStrings("NE40E>","SE800#",5)<>False)

EndFunction

'退出设备子函数

FunctionExitDevice

IfResultOfType=1Then

ElseIfResultOfType=2Then

""&"quit"&chr(13)

Do

""&chr(13)

LoopUntil(rString("Console>>",1)<>False)

ElseIfResultOfType=3Then

""&"exit"&chr(13)

Do

""&chr(13)

LoopUntil(rString("Console>>",1)<>False)

Else

EndIf

EndFunction

FunctionShowAll

Dowhile(rStrings("More","more",3)<>False)

""

Loop

EndFunction

'风险命令过滤子函数

FunctionRiskCommands

Dimresult

result=rStrings(ArreOfRiskCommands,1)

Ifresult<>FalseThen

MsgBox"Thecommandyouareimportingexistsrisk!"

Do

Loop

EndIf

EndFunction

SubMain

onous=True

LandIPNET

ForDeviceNumth=LBound(Device)ToUBound(Device)

LandDevice

CommandNumth=0

ForCommandNumth=LBound(TypeOfCommand)ToUBound(TypeOfCommand)

""&TypeOfCommand(CommandNumth)

RiskCommands

""&chr(13)

ShowAll

rString("More",1)<>FalseThenShowAll

4000

""&chr(13)

Next

ExitDevice

Next

onous=False

EndSub

二、 自动化脚本编写

三段模式模板

从一个文件(目录为C:)里面自动读取设备IP地址,密码等,自动登录设备

进入特权模式

第一种情况:用户名+密码+特权密码方式

# $language = “VBScript”

# $interface = “1.0″

Sub Main

‘打开保存设备管理地址以及密码的文件

Const ForReading = 1, ForWriting = 2, ForAppending = 8

Dim fso,file1,line,params

Set fso = CreateObject(“stemObject”)

Set file1 = xtFile(“C:”,Forreading, False)

onous = True

DO While fStream <> True

‘读出每行

line = ne

‘分离每行的参数 IP地址 用户名 密码 特权密码

params = Split (line)

‘Telnet到这个设备上

t (“/TELNET ” & params(0))

‘输入telnet用户名和密码

rString “sername:”

params(1) & vbcr

rString “assword:”

params(2) & vbcr

‘进特权模式

“enable” & vbcr

‘输入特权密码

rString “assword:”

params(3) & vbcr

rString “#”

里相对应的IP地址、用户名、密码、特权密码,分别如下:

192.168.1.1 admin ruijie ruijie

192.168.1.2 admin ruijie ruijie

192.168.2.1 admin ruijie ruijie

……

第二种情况:密码+特权密码方式

# $language = “VBScript”

# $interface = “1.0″

Sub Main

‘打开保存设备管理地址以及密码的文件

Const ForReading = 1, ForWriting = 2, ForAppending = 8

Dim fso,file1,line,params

Set fso = CreateObject(“stemObject”)

Set file1 = xtFile(“C:”,Forreading, False)

onous = True

DO While fStream <> True

‘读出每行

line = ne

‘分离每行的参数 IP地址 密码 特权密码

params = Split (line)

‘Telnet到这个设备上

t (“/TELNET ” & params(0))

‘输入telnet密码

rString “assword:”

params(1) & vbcr

‘进特权模式

“enable” & vbcr

‘输入特权密码

rString “assword:”

params(2) & vbcr

rString “#”

里相对应的IP地址、密码、特权密码,分别如下:

192.168.1.1 admin ruijie

192.168.1.2 admin ruijie

192.168.2.1 admin ruijie

……

脚本发送命令:

”要发送的命令” & chr(13) //这个是回车,并且每行只发送一个命令

如下,进入全局模式下,去掉OSPF进程号800

“conf t” & chr(13)

rString “(config)#”

“no router ospf 800″ & chr(13)

rString “(config)#”

“end” & chr(13)

rString “#”

“wr” & chr(13)

J 这样去写是相当困难的,所以我们可以用先录制好需要进行相关操作的脚本,打开那个

录制好的,复制那些相关的命令 这样不用自己逐条手写了

完成一台设备的操作之后,退出并进入下一台设备

‘完成后退出

rString “#”,3 //等待3S后如果没有其它操作,则自动断开

nect

loop

onous = False

End Sub

三、 应用案例

真实场景:

客户升级,客户有145台设备需要升级,其中有,也有少部分的

首先查找当前运行的是还是

运行脚本,并记录日志到一个文本中,按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(“stemObject”)

Set file1 = xtFile(“C: “,Forreading, False)

onous = True

DO While fStream <> True

line = ne

params = Split (line)

t “/TELNET ” & params(0)

rString “sername:”

params(1) & vbcr

rString “assword:”

params(2) & vbcr

“enable” & vbcr

rString “#”

“show ver” & vbcr

rString “#”

vbcr

rString “#”,3

nect

loop

onous = False

End Sub

C:中的内容如下

10.243.124.1 XXXX XXXX

10.243.124.10 XXXX XXXX

完成show ver后,查看日记记录,找到当前运行的是设备,并把他的IP地址从中去

掉,新建

升级:

# $language = “VBScript”

# $interface = “1.0″

Sub Main

Const ForReading = 1, ForWriting = 2, ForAppending = 8

Dim fso,file1,line,params

Set fso = CreateObject(“stemObject”)

Set file1 = xtFile(“C: “,Forreading, False)

onous = True

DO While fStream <> True

line = ne

params = Split (line)

t “/TELNET ” & params(0)

rString “sername:”

params(1) & vbcr

rString “assword:”

params(2) & vbcr

“enable” & vbcr

rString “#”

“copy tftp://10.14.192.13/R2700_94674_ flash:” & vbcr

rString “UPGRADING OK.”

rString “#”

vbcr

rString “#”,3

nect

loop

onous = False

End Sub

的升级方法也是同样的

在合适的时间重启:

# $language = “VBScript”

# $interface = “1.0″

Sub Main

Const ForReading = 1, ForWriting = 2, ForAppending = 8

Dim fso,file1,line,params

Set fso = CreateObject(“stemObject”)

Set file1 = xtFile(“C: “,Forreading, False)

onous = True

DO While fStream <> True

line = ne

params = Split (line)

t “/TELNET ” & params(0)

rString “sername:”

params(1) & vbcr

rString “assword:”

params(2) & vbcr

“enable” & vbcr

rString “#”

“reload in 1″ & vbcr

rString “#”

vbcr

rString “#”,3

nect

loop

onous = False

End Sub

重启过程中用批量ping工具监视,重启完成后查看是否都正常

说明

注意事项:如果运行过程中telnet到一台不可达的设备后,则脚本会中断,刚需要人工去再次运行,

故运行之前先用批量ping工具测试设备连通性

自动登录脚本

下面是我根据上面的文档编写的没有用户名的自动登录

# $language = "VBScript"

# $interface = "1.0"

Sub Main

'打开保存设备管理地址以及密码的文件

Const ForReading = 1, ForWriting = 2, ForAppending = 8

Dim fso,file1,line,params

Set fso = CreateObject("stemObject")

Set file1 = xtFile("C:",Forreading, False)

onous = True

DO While fStream <> True

'读出每行

line = ne

'分离每行的参数 IP地址 密码 特权密码

params = Split (line)

'Telnet到这个设备上

t ("/TELNET " & params(0))

'输入telnet用户名和密码

rString "assword:"

"cisco" & vbcr

'进特权模式

"enable" & vbcr

'输入特权密码

rString "assword:"

"cisco" & vbcr

rString "#"

"show ver" & vbcr

rString "#"

"clear counters" & vbcr & vbcr

rString "#" ,300

nect

loop

onous = False

End Sub

四、 其他示例

【示例一】简单自动登录

# $language = "VBScript"

# $interface = "1.0"

'本脚本示范:自动登录到某台3550交换机设备,自动输入远程登录密码,同时自动进入特权模式

'自动输入特权密码,同时运行show version命令

Sub Main

onous = True

'通过telnet连接到192.168.1.1

t "/TELNET 192.168.1.1"

rString "Password:"

"cisco" & vbCr

rString ">"

"enable" & vbcr

rString "Password:"

"cisco" & vbcr

rString "#"

"show version" & vbcr

rString "--More--"

" "

onous = False

End Sub

【示例二】自动备份配置

# $language = "VBScript"

# $interface = "1.0"

'本脚本示范:从一个文件里面自动读取设备IP地址,密码等,自动将设备配置备份

Sub Main

'打开保存设备管理地址以及密码的文件

Const ForReading = 1, ForWriting = 2, ForAppending = 8

Dim fso,file1,line,str1,params

Set fso = CreateObject("stemObject")

Set file1 = xtFile("d:",Forreading, False)

onous = True

DO While fStream <> True

'读出每行

line = ne

'分离每行的参数 IP地址 密码 En密码

params = Split (line)

'Telnet到这个设备上

t "/TELNET " & params(0)

'输入telnet密码

rString "Password:"

params(1) & vbcr

'进特权模式

"enable" & vbcr

rString "Password:"

params(2) & vbcr

rString "#"

'备份目前Startup配置

str1 = "copy startup t

ftp://192.168.1.2/

"

str1 = str1 & "backup(" & params(0) &")" & ".cfg"

str1 & vbcr

rString "]?"

vbcr

rString "]?"

vbcr

'备份完成后退出

rString "#",3

nect

loop

onous = False

End Sub

文本文件为事先编辑好的

格式如:

192.168.1.1 cisco cisco

192.168.1.254 cisco cisco

前面是IP地址,后面是telnet密码,最后是enable密码

【示例三】多会话操作

VBScript

# $language = “VBScript”

# $interface = “1.0″

‘~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sub Main()

onous = true

Dim Name

Dim Nametre

Dim nTabCount

nTabCount = Count()

for index = 1 to nTabCount

set tab = (index)

te

If ted = True Then

‘这里以上都没有什么可以说的,之前的文章已经介绍的很多很多了,如果有不清楚的朋友可以看本

文上提供的该系列脚本的其它部分的文章链接

‘从这里往下就是最最核心的部分的了:)

‘获取激活会话的名称

Name = n

‘开始做匹配,并根据匹配的结果输入相应命令

Select Case Nametre

Case “你的会话的名称1″

‘等待1秒钟

1000

“在名称1的会话中你要输入的命令1″ & chr(13)

‘等待1秒钟

1000

“在名称1的会话中你要输入的命令2″ & chr(13)

1000

……..

Case “你的会话的名称2″

‘等待1秒钟

1000

“在名称2的会话中你要输入的命令1″ & chr(13)

‘等待1秒钟

1000

“在名称2的会话中你要输入的命令2″ & chr(13)

1000

……..

Case “你的会话的名称3″

‘等待1秒钟

1000

“在名称3的会话中你要输入的命令1″ & chr(13)

‘等待1秒钟

1000

“在名称3的会话中你要输入的命令2″ & chr(13)

1000

……..

‘其它情况输出 ”the name of this session is wrong!”

Case Else MsgBox “the name of this session is wrong!”

End Select

Else

MsgBox “this session is not connected,can not input any command!”

End If

Next

End Sub

【示例四】多会话操作2

以下可以实现在已经打开的绘画窗口中,按照打开顺序输入固定的命令,即第一个窗口输入****,然

后激活第二个窗口输入*****,多窗口的命令输入是解决了,但是在实际的工作中发现,这样的一个

脚本存在不少的缺陷:第一,会话窗口需要按照顺序手动打开,且要按照一定的顺序打开;第二,打

开的顺序一旦有错,命令就会输入错误,命令输入没有自适应性;第三,会话的打开是要输入相应的

命令,可是命令的结果仍然需要手动保存

【示例五】设备log保存

这个脚本主要是用来将我们在第一步中打开的会话用log保存在一个我们设定的路径上,这样就可以

将后续输入命令的结果自动保存在本地,方便后续的查看对比等工作,下面就让我们来看看这个“打

开各个板卡log脚本”的具体的编写情况:

# $language = “VBScript”

# $interface = “1.0″

‘~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sub Main()

onous = true

‘定义两个变量

Dim Name

Dim nCurrentTab

‘nTabCount赋值为打开的会话的总个数

nTabCount = Count()

‘做循环

for index = 1 to nTabCount

‘激活第index个会话

set tab = (index)

te

‘判断log的情况并获取会话的名称

‘log到路径“D:新建文件夹”中,并命名为“会话名称.log”

If ted = True Then

If g = False Then

Name = n

eName = “D:新建文件夹”&Name&”.log”

True

ElseIf g = True Then

False

Name = n

eName = “D:新建文件夹”&Name&”.log”

True

Else MsgBox “something unknown is wrong!”

End If

Else MsgBox “this session is not connected,no need to be logged!”

End If

Next

End Sub

【示例六】批量关闭log

# $language = “VBScript”

# $interface = “1.0″

‘脚本开始

Sub Main()

‘ 从左到右激活每一个已经连接上的会话,并输入相关命令

‘第一个连接的会话

Set objCurrentTab1 = (1)

te

If ted = True then

“相关命令1″ & chr(13)

rString “-> “

“相关命令2 ” & chr(13)

rString “-> ”

“相关命令3 ” & chr(13)

rString “-> ”

End If

‘第二个连接的会话

Set objCurrentTab2 = (2)

te

If ted = True then

“相关命令1″ & chr(13)

rString “-> “

“相关命令2 ” & chr(13)

rString “-> “

“相关命令3″ & chr(13)

rString “-> “

“相关命令4″ & chr(13)

End if

‘ 第N个连接的会话

’脚本结束

End Sub

个脚本主要是用来将我们在可以一次性关闭“打开所有板卡会话脚本”中打开的会话log,这样在需

要的操作完成后就可以及时的关闭log,达到控制log文件大小的作用:

# $language = “VBScript”

# $interface = “1.0″

‘~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sub Main()

onous = true

‘定义两个变量

Dim Name

Dim nCurrentTab

‘nTabCount赋值为打开的会话的总个数

nTabCount = Count()

‘做循环

for index = 1 to nTabCount

set tab = (index)

‘激活第index个会话

te

‘关闭log

If ted = True Then

If g = False Then

MsgBox “this session is already unlogged!”

ElseIf g = True Then

False

Else MsgBox “something unknown is wrong!”

End If

Else MsgBox “this session is not connected,no need to be unlogged!”

End If

Next

End Sub

【示例七】打开会话

这个脚本要实现的就是一次性的打开我们要输入不同命令的所有的会话

# $language = “VBScript”

# $interface = “1.0″

‘~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sub Main()

onous = true

‘打开在SecureCRT中已经保存在huaye文件夹下的会话

set tab1 = tintab(”/s huaye/已存会话1″)

set tab2 = tintab(”/s huaye/已存会话2″)

set tab3 = tintab(”/s huaye/已存会话3″)

set tab4 = tintab(”/s huaye/已存会话4″)

End Sub