将脚本与SecCRT结合起来可以实现SecCRT输入、输出、字符处理的完全自动化。对于少量的命令,可以直接通过SecCRT提供的快捷键设置方式完成。而对于复杂的命令,则可以自己编写代码来实现。将原本两三天的测试工作量压缩到半天也是可能的。
下面的VB脚本例子是使用SecCRT API实现自动登录、进入前台单板各进程,获取进程号,输入各相关命令,同时可以保存日志的操作。依靠快捷键是无法完成这样工作的。它与具体的前台操作模型是精密关联的,往往需要根据前台终端命令操作方式进行编写。
SecCRT一般支持VB和JavaScript两种解释语言,在SecCRT的帮助文件中有详细描述,并且SecCRT也提供了多个例子供大家学习。
# $language = "VBScript"
# $interface = "1.0"
'--------------------------------------------------------
' Automatic VBS for Security CRT
' Author: Raymond
' 2011.1.5.
'--------------------------------------------------------
'--------------------------------------------------------
' Config The Followings:
'--------------------------------------------------------
'File Log
Const logFile = "c:\scrt_logfile.txt"
Dim IPs 'Board IP
IPs = Array("128.131.17.167")
'Cmd 1
Dim shObj1
Set shObj1 = New shClass
shObj1.shName = "SBCJ_PS_MP"
shObj1.shCmd = Array("mmeEMMClearStatistic{(}{)}","mmeESMDebugClearStatistic{(}{)}")
'Cmd 2
Dim shObj2
Set shObj2 = New shClass
shObj2.shName = "EPU"
shObj2.shCmd = Array("stt_clear_sctp{(}{)}","stt_clear_sctplink{(}{)}")
'All Cmds
Dim shObjs
shObjs = Array(shObj1)
'--------------------------------------------------------
' Config End
'--------------------------------------------------------
Dim g_fso
Set g_fso = CreateObject("Scripting.FileSystemObject")
Const ForAppending = 8
'---------------------------------------------------
'Sh CMD Class
'---------------------------------------------------
Class shClass
Public shName 'sh Name, String
Public shCmd 'Cmd String Array in this sh
Private Sub Class_Initialize
End Sub
Private Sub Class_Terminate ' 设置 Terminate 事件.
End Sub
End Class
'---------------------------------------------------
'Compare the patrn in this String
'---------------------------------------------------
Function RegExpTest(patrn, strng)
Dim regEx, Match, Matches ' 建立变量。
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = patrn ' 设置模式。
regEx.IgnoreCase = True ' 设置是否区分大小写。
regEx.Global = True ' 设置全局替换。
Set Matches = regEx.Execute(strng) ' 执行搜索。
isFind = 0
For Each Match in Matches ' 遍历 Matches 集合。
RegExpTest = 1
Exit Function
Next
RegExpTest = 0
End Function
'---------------------------------------------------
'Get Sh No. List
'---------------------------------------------------
Function GetShNum(inStr, strName)
Dim strArray,strList,strItem,i
ReDim rtn(8)
strArray = Split(inStr, vbcrlf, -1, 1)
i=0
For Each strList In strArray
strItem = Split(strList, " ", -1, 1)
If Ubound(strItem) > 5 Then
If RegExpTest(strName,strList) = 1 Then
rtn(i)=strItem(0)
i=i+1
End If
End If
Next
ReDim Preserve rtn(i)
GetShNum = rtn
End Function
Dim Session,proStr
'---------------------------------------------------
'Stata One Tab
'---------------------------------------------------
Function StatTab(Ipaddr)
Dim Str
Set tab = crt.session.ConnectInTab("/telnet " & Ipaddr & " 10000",True)
If Err.Number <> 0 Then
WriteToFile "Error: Open Tab " & Ipaddr & " Failed !"
tab.Close
Exit Function
Else
tab.Caption=Ipaddr
End If
'Get Screen, login
Set Screen = tab.Screen
' If Screen.WaitForString("login:", 10) <> True Then
' WriteToFile "Failed to detect login : " & Ipaddr
' Exit Function
' End If
crt.Sleep 50
Screen.sendkeys("zte{ENTER}")
' If Screen.WaitForString("password:", 10) <> True Then
' WriteToFile "Failed to detect password : " & Ipaddr
' Exit Function
' End If
crt.Sleep 50
Screen.sendkeys("zte{ENTER}")
WriteToFile "Log: telnet " & Ipaddr & " Successed !"
If Screen.WaitForString("ushell!", 1000) <> True Then
WriteToFile "Failed to detect ushell : " & Ipaddr
Exit Function
End If
Screen.sendkeys("{ENTER}")
crt.Sleep 50
proStr=""
While Len(proStr) < 10 '没有取到内容,继续....
Screen.sendkeys("show{ENTER}{ENTER}")
proStr = Screen.ReadString("[admin]#",10) '保留到该函数结束
Wend
WriteToFile "Get All Proc List"
WriteToFile proStr
'对所有配置的命令,查找相应的进程号,并执行
Dim tmpObj,shItem,shList,cmdItem
For each tmpObj in shObjs
shList = GetShNum(proStr,tmpObj.shName)
'WriteToFile "Bound is " & UBound(shList)
For Each shItem In shList
If Len(shItem) <> 0 Then
'进入该进程
Screen.sendkeys("sh "& shItem & "{ENTER}{ENTER}")
If Screen.WaitForString("Now switch to", 1000) <> True Then
WriteToFile "Failed to switch to ushell " & shItem & " in " & Ipaddr
Else
WriteToFile "Switch to shell " & shItem & " in " & Ipaddr
'循环执行命令
For Each cmdItem in tmpObj.shCmd
Screen.sendkeys(Trim(cmdItem) & "{ENTER}{ENTER}")
If Screen.WaitForString("value", 1000) <> True Then
WriteToFile "Failed to Exec Cmd " & cmdItem & " in " & Ipaddr
Else
WriteToFile "Succeed to Exec Cmd " & cmdItem & " in " & Ipaddr
End If
crt.Sleep 200
Next
End If
Screen.sendkeys("admin{ENTER}{ENTER}") '退出到最外层
If Screen.WaitForString("Reset to [admin]", 1000) <> True Then
WriteToFile "Failed to switch to Admin " & " in " & Ipaddr
Exit Function
End If
crt.Sleep 200
End If
Next
Next
Screen.sendkeys("{ENTER}{ENTER}") 'Goodbye
WriteToFile "Finished " & Ipaddr
End Function
'---------------------------------------------------
'State All Tabs, each IP every tab
'---------------------------------------------------
Sub StatAllTabs
Dim ip
For Each ip in IPs
StatTab(ip)
crt.Sleep 1000
Next
End Sub
'---------------------------------------------------
'Log File Open
'---------------------------------------------------
Const bUnicode = False
Dim objFile
Function OpenFile(szFile)
Set bjFile = g_fso.OpenTextFile(szFile, ForAppending, True, bUnicode)
End Function
'---------------------------------------------------
'Log File Close
'---------------------------------------------------
Function CloseFile()
objFile.Close
End Function
'---------------------------------------------------
'Write to File
'---------------------------------------------------
Function WriteToFile(szData)
WriteToFile = False
objFile.Write szData
objFile.Write vbcrlf
WriteToFile = True
End Function
'Main
Sub Main
OpenFile(logFile)
StatAllTabs
CloseFile
End Sub