为了工作方便,自己写了个脚本用
不过只能在secureCRT上支持Cisco的设备,因为其中的词法分析只适用于Cisco的配置
脚本的功能还行,可以自动识别SSH2和Telnet登录,因为我的工作环境有些设备不支持SSH2,所以只能用Telnet
可以自定义需要批量使用的命令,并会按照日期自动保存在不同的log文件中,方便检查
也可以开启自动生成关键信息excel的功能,这会在刚刚保存的log文件中提取关键信息,例如hostname,ip address,model,SN,image,uptime
#$language = "VBScript"
#$interface = "1.0"
crt.Screen.Synchronous = True
'------------------------------------------------------------------------------------------------------'
'全局常量在整个程序中均有效
'设置SSH用户名和密码
Const UserName1 = """Mr Right""" , PassWord1 = "Michael123!" , EnablePassWD1 = "Michael123!"
'设置Telnet用户名和密码以及enable密码
Const UserName2 = "Mr Right", PassWord2 = "Michael123!", EnablePassWD2 = "Michael123!"
'设置地址表位置
Const LstFileLK = "D:\Desktop\scripts\123.txt"
'设置思科命令表位置
Const CmdFileForCISCO = "D:\Desktop\scripts\testcmd.txt"
'设置回显保存的位置(此处只要设置保存到的文件夹位置,命令产生的回显会自动以IP.TXT保存在不同文件中)
Const LogFileLK = "D:\Desktop\scripts\LOG\"
' 是否创建Excel文件,自动提取关键信息(HostName、IP Address、Model、SN、Image、UpTime)
const isCreateExcelFile = true
'设置常量Read为1,Write为2
Const Read = 1, Write = 2
'每条命令刷新时间(机器比较好的时候,可以改小点)
const waitingForCmd = 5
'------------------------------------------------------------------------------------------------------'
'主函数
Sub Main
'定义两个变量(注:fso为局部变量仅在此函数中有效)
Dim fso, LstFile
'调用函数创建文件系统对象
Set fso = CreateObject("Scripting.FileSystemObject")
'调用函数创建对象的属性(读取地址表中的内容)
Set LstFile = fso.OpenTextFile(LstFileLK, Read, False)
'调用Login子函数,以地址作为参数做登录方式检测
Do While (LstFile.AtEndOfStream <> True)
if Login(LstFile.ReadLine) then
RunCommand()
end if
Loop
'是否创建Excel文件
if isCreateExcelFile then
dateTime = date()
dateTime = Replace(dateTime,"/","-")
createExcel LogFileLK & dateTime & ".xlsx", LogFileLK & date() & "\"
MsgBox("Create " & LogFileLK & dateTime & ".xlsx" & " successful!")
end if
'Crt运行完毕
Crt.Screen.Synchronous = False
'程序结束
End Sub
'------------------------------------------------------------------------------------------------------'
'Login子函数(登录检测)
function Login(IP)
'函数返回值
Login = True
'创建回显保存的文件名(IP.TXT)
Crt.Session.LogFileName = LogFileLK & date() & "/" & IP & ".txt"
'登录方式
Login = SSH2Connect(IP)
if NOT Login then
Login = TelnetConnect(IP)
dim fso, file
set fso = CreateObject("Scripting.FileSystemObject")
if Login then
set file = fso.GetFile(LogFileLK & date() & "\" & "SSH2Fail-" & IP & ".txt")
file.Delete
else
set file = fso.GetFile(LogFileLK & date() & "\" & IP & ".txt")
file.Delete
end if
end if
'MsgBox Login
'返回主函数
End function
'------------------------------------------------------------------------------------------------------'
function SSH2Connect(IP)
'函数返回值
SSH2Connect = True
Crt.Session.Log(True)
'此部分实例代码在scripting_essentials.pdf的P31有详细解释
On Error Resume Next
crt.Session.Connect("/SSH2 /L " & UserName1 & " /PASSWORD " & PassWord1 & " " & IP)
nError = Err.Number
strErr = Err.Description
' Now, tell the script host that it should handle errors as usual now:
On Error Goto 0
If nError <> 0 Then
' Handle the error (log to a file, etc.)
SSH2Connect = false
Crt.Session.Log(false)
Crt.Session.LogFileName = LogFileLK & date() & "\" & "SSH2Fail-" & IP & ".txt"
crt.Session.Disconnect
Else
' Do work on the remote machine
Select Case Crt.Screen.WaitForStrings(">","#",10)
'需要输入enable密码
Case 1
SendEnablePasswd()
'特权模式
Case 2
Crt.Screen.Send vbCr
End Select
End If
end function
'------------------------------------------------------------------------------------------------------'
function TelnetConnect(IP)
'函数返回值
TelnetConnect = True
Crt.Session.Log(True)
On Error Resume Next
crt.Session.Connect("/Telnet" & " " & IP)
nError = Err.Number
strErr = Err.Description
' Now, tell the script host that it should handle errors as usual now:
On Error Goto 0
If nError <> 0 Then
' Handle the error (log to a file, etc.)
TelnetConnect = false
Crt.Session.Log(false)
Crt.Session.LogFileName = LogFileLK & date() & "\" & "TelnetFail-" & IP & ".txt"
crt.Session.Disconnect
Else
Select Case crt.Screen.WaitForStrings("ame",10)
'输入用户名和密码
Case 1
Crt.Session.Log(false)
Crt.Screen.Send UserName2
crt.Screen.Send vbcr
Crt.Screen.WaitForString("assword: ")
Crt.Screen.Send(PassWord2 & vbcr)
Crt.Screen.Send vbCr
Crt.Session.Log(true)
if (crt.Screen.WaitForStrings(">","#") <> 2) then
SendEnablePasswd()
else
Crt.Screen.Send vbCr
end if
end Select
End If
end function
'------------------------------------------------------------------------------------------------------'
'发送enable密码
sub SendEnablePasswd()
Crt.Screen.Send "enable" & vbCr
Crt.Screen.WaitForString("assword: ")
Crt.Screen.Send EnablePassWD1 & vbCr
Crt.Screen.Send vbCr
end sub
'------------------------------------------------------------------------------------------------------'
'RunCommand子函数
Sub RunCommand()
'此处fso变量属于局部变量,所以不会和主函数中的fso变量冲突
Dim fso, CmdFile, CMD
'创建对象
Set fso = CreateObject("Scripting.FileSystemObject")
Set CmdFile = fso.OpenTextFile(CmdFileForCISCO, Read, False)
'循环执行命令表中的命令直到结束
Do While CmdFile.AtEndOfStream <> True
CMD = CmdFile.ReadLine
'执行命令表中的命令
crt.Screen.Send CMD & vbcr
'超过屏幕时,按空格
Do While (crt.Screen.WaitForString("More",waitingForCmd) = True)
crt.Screen.Send(" ")
Loop
crt.Screen.Send vbCr
'循环结束
Loop
Crt.Session.Log(false)
'关闭CRT对话框
crt.Session.Disconnect
'返回Login子函数
End Sub
'------------------------------------------------------------------------------------------------------'
' 创建Excel
function createExcel(fileName, dirName)
createExcel = true
createExcelHeard fileName, dirName
end function
'------------------------------------------------------------------------------------------------------'
' 创建Excel表头
' 格式:
' No HostName IP Address Model SN Image UpTime
' 1 P03-S-3750G-2 10.93.1.32 WS-C3750G-24TS-S1U FOC**0223ST c3750-ipbasek9-mz.122-55.SE11.bin 8w4d21h51m
' 2 P03-S-3750G-2 10.93.1.32 WS-C3750G-24TS-S1U FOC**0223ST c3750-ipbasek9-mz.122-55.SE11.bin 8w4d21h51m
function createExcelHeard(fileName, dirName)
createExcelHeard = true
dim objExcelApp, objExcelBook, objExcelSheet
'fileName =
set objExcelApp = CreateObject("excel.application")
set objExcelBook = objExcelApp.WorkBooks.Add
set objExcelSheet = objExcelBook.ActiveSheet
' 生成excl表头
objExcelSheet.Cells(1,1) = "No"
objExcelsheet.Cells(1,2) = "FileName"
objExcelSheet.Cells(1,3) = "HostName"
objExcelSheet.Cells(1,4) = "IP Address"
objExcelSheet.Cells(1,5) = "Model"
objExcelSheet.Cells(1,6) = "SN"
objExcelSheet.Cells(1,7) = "Image"
objExcelSheet.Cells(1,8) = "UpTime"
' 读取文件中的详细信息
' 创建文件系统对象
set fso = CreateObject("Scripting.FileSystemObject")
' 获得文件对象
set objFolder = fso.GetFolder(dirName)
' 获得文件清单
set objFiles = objFolder.Files
dim row, column, number
row = 2
column = 1
' 循环获得每个文件
for each file in objFiles
' 填写No
objExcelSheet.Cells(row,column) = row - 1
' 填写提取文件名
column = column + 1
objExcelSheet.Cells(row,column) = file.name
' 填写HostName
column = column + 1
objExcelSheet.Cells(row,column) = getInformation(dirname & file.name, "HostName")
' 填写IP Address
column = column + 1
objExcelSheet.Cells(row,column) = getInformation(dirname & file.name, "IP Address")
' 填写Model
column = column + 1
objExcelSheet.Cells(row,column) = getInformation(dirname & file.name, "Model")
' 填写SN
column = column + 1
objExcelSheet.Cells(row,column) = getInformation(dirname & file.name, "SN")
' 填写Image
column = column + 1
objExcelSheet.Cells(row,column) = getInformation(dirname & file.name, "Image")
' 填写UpTime
column = column + 1
objExcelSheet.Cells(row,column) = getInformation(dirname & file.name, "UpTime")
' 下一行
column = 1
row = row + 1
next
' 调整excl格式
for i = 65 to 72
objExcelSheet.Columns(chr(i)).AutoFit
next
objExcelBook.SaveAs(fileName)
objExcelBook.Close
objExcelApp.Quit
end function
'------------------------------------------------------------------------------------------------------'
' 函数功能:获得关键信息
' szFileName:文件名
' szInformation:需要获取的信息,支持五种信息的获取HostName、Image、SN、Model和UpTime
' 返回值:根据不同的szInformation返回不同的信息,如果未找到需要的信息则返回N/A
' 用法1获得文件中设备IOS型号: getInformation("D:\DeskTop\10.93.1.32.txt", "Image")
' 用法2获得文件中设备SN号: getInformation("D:\DeskTop\10.93.1.32.txt", "SN")
' 用法3获得文件中设备型号: getInformation("D:\DeskTop\10.93.1.32.txt", "Model")
' 用法4获得文件中设备启动时长: getInformation("D:\DeskTop\10.93.1.32.txt", "UpTime")
' 用法5获得文件中设备HostName: getInformation("D:\DeskTop\10.93.1.32.txt", "HostName")
function getInformation(szFileName,szInformation)
dim fso, objFile
dim szLine, isInforLine
getInformation = "N/A"
isInforLine = 0
set fso = CreateObject("Scripting.FileSystemObject")
' 检查文件是否存在
if fso.FileExists(szFileName) then
set objFile = fso.OpenTextFile(szFileName, 1, false)
' 循环读行
do While(objFile.AtEndOfStream <> true)
szline = objFile.ReadLine
' 信息筛选
select case szInformation
' 需要IOS信息
' 搜索System image file is字符串
' 例如:System image file is "flash:/c3750-ipbasek9-mz.122-55.SE11.bin"
case "Image"
' 如果该行有需要的信息则传递给专用词法分析函数,做进一步信息提取
isInforLine = InStr(szline,"System image file is")
if isInforLine then
getInformation = getImage(szline)
objFile.close()
' 找到信息退出函数
exit function
end if
' 需要SN信息
' 搜索Processor board ID字符串
' 例如Processor board ID FOC1102Z8FE
case "SN"
' 如果该行有需要的信息则传递给专用词法分析函数,做进一步信息提取
isInforLine = InStr(szline,"Processor board ID")
if isInforLine then
getInformation = getSN(szline)
objFile.close()
' 找到信息退出函数
exit function
end if
' 需要设备型号信息
' 搜索bytes of memory.字符串
' 例如:cisco WS-C3750G-24TS-1U (PowerPC405) processor (revision D0) with 131072K bytes of memory.
case "Model"
' 如果该行有需要的信息则传递给专用词法分析函数,做进一步信息提取
isInforLine = InStr(szline,"bytes of memory.")
if isInforLine then
getInformation = getModel(szline)
objFile.close()
' 找到信息退出函数
exit function
end if
' 需要启动时间信息
' 搜索UpTime is字符串
' 例如:P03-S-3750G-2 uptime is 8 weeks, 4 days, 21 hours, 51 minutes
case "UpTime"
' 如果该行有需要的信息则传递给专用词法分析函数,做进一步信息提取
isInforLine = InStr(szline,"uptime is")
if isInforLine then
getInformation = getUptime(szline)
objFile.close()
' 找到信息退出函数
exit function
end if
' 需要启动时间信息
' 搜索#字符串
' 例如:P03-S-3750G-2#sh ver
case "HostName"
' 如果该行有需要的信息则传递给专用词法分析函数,做进一步信息提取
isInforLine = InStr(szline,"#")
if isInforLine then
getInformation = getHostName(szline)
objFile.close()
' 找到信息退出函数
exit function
end if
end select
loop
' 如果没找到信息则返回 "N/A"
else
' 文件不存才时
getInformation = "No this file!"
end if
end function
'------------------------------------------------------------------------------------------------------'
' 提取IOS
' 例如:System image file is "flash:/c3750-ipbasek9-mz.122-55.SE11.bin"
function getImage(szline)
dim tmpImage1, tmpImage2, tmpImage3, image
' 先以空格分割每个单词
tmpImage1 = Split(szline," ")
' 得到数组中最后一个单词,即"flash:/c3750-ipbasek9-mz.122-55.SE11.bin"
tmpImage2 = tmpImage1(UBound(tmpImage1))
' 替换单词中的"号为空格,并使用/分割字符串
' 注:chr(34)就是"的ASCII码
tmpImage3 = Split(Replace(tmpImage2,chr(34)," "),"/")
' 返回数组中最后一个单词,即c3750-ipbasek9-mz.122-55.SE11.bin
getImage = tmpImage3(UBound(tmpImage3))
if InStr(getImage,":") then
tmpImage1 = Split(getImage,":")
getImage = tmpImage1(UBound(tmpImage1))
end if
end function
'------------------------------------------------------------------------------------------------------'
' 提取设备SN号码
' 例如Processor board ID FOC1102Z8FE
function getSN(szline)
dim SN
' 先以空格分割每个单词
SN = Split(szline," ")
' 返回数组中最后一个单词,即FOC1102Z8FE
getSN = SN(UBound(SN))
end function
'------------------------------------------------------------------------------------------------------'
' 提取设备型号
' 例如:cisco WS-C3750G-24TS-1U (PowerPC405) processor (revision D0) with 131072K bytes of memory.
function getModel(szline)
dim Model
' 先以空格分割每个单词
Model = Split(szline, " ")
' 返回数组中第二个单词(数组是从0开始的,所以1是第二个),即WS-C3750G-24TS-1U
getModel = Model(1)
end function
'------------------------------------------------------------------------------------------------------'
' 提取设备启动时长
' 例如:P03-S-3750G-2 uptime is 8 weeks, 4 days, 21 hours, 51 minutes
' 返回值的格式为 8w4d21h51m
function getUptime(szline)
dim uptime, tmpUptime1
' 先以空格分割每个单词
tmpUptime1 = Split(szline," ")
' 循环找出对应的时间信息,并拼接字符串
for i = 0 to UBound(tmpUptime1)
select case tmpUptime1(i)
case "weeks,"
uptime = tmpUptime1(i-1) & "w"
case "days,"
uptime = uptime & tmpUptime1(i-1) & "d"
case "hours,"
uptime = uptime & tmpUptime1(i-1) & "h"
case "minutes"
uptime = uptime & tmpUptime1(i-1) & "m"
end select
next
getUptime = uptime
end function
'------------------------------------------------------------------------------------------------------'
' 提取设备名字
function getHostName(szline)
dim HostName
HostName = Split(szline,"#")
getHostName = HostName(0)
end function
'------------------------------------------------------------------------------------------------------'
'Mr Right 2018.1.2编写
'版本2.1.0
'SSH2 & Telnet
'可自动识别SSH2和Telnet登录方式
'回显超过屏幕显示时(出现--More--)会自动按空格
'可自动生成excel,提取关键信息(关键信息包括HostName、IP Address、Model、SN、Image、UpTime)