secureCRT思科路由器交换机接口信息收集脚本

工作时需要和布线人员做一定的交互,所以写了个secureCRT的可以看设备接口的脚本

当然,只支持Cisco设备

先在脚本中设置好SSH和telnet的用户名和密码,再直接在secureCRT运行,输入设备IP地址就行了

会自动发送show inter和show int status命令给设备,然后回显会各自保存在系统临时目录的临时文件中

通过词法分析取出各种关键信息,并在桌面生成以年-月-日-IP.xslx命名的excel表格,再自动删除临时文件

效果就是下面这个样子的

#$language = "VBScript"
#$interface = "1.0"
crt.Screen.Synchronous = true

'设置SSH用户名和密码
const UserName1 = """MrRight 17""" , PassWord1 = "Michael123!" , EnablePassWD1 = "Michael123!"
'设置telnet用户名和密码
const UserName2 = "MrRight 17"
'设置常量Read为1,Write为2
const Read = 1, Write = 2

'每条命令刷新时间(机器比较好的时候,可以改小点)
const waitingForCmd = 5

dim IPADDR
dim szIntlogFileName
dim szVIDlogFileName

sub Main

    IP = InputBox("Enter IP address : ")
    IPADDR = IP
    '保存log文件到临时目录
    dim fso 
    set fso = CreateObject("Scripting.FileSystemObject")       
    dim tempfolder 
    const TemporaryFolder = 2 
    set tempfolder = fso.GetSpecialFolder(TemporaryFolder) 

    szIntlogFileName = tempfolder & "\" & IP & ".txt"
    szVIDlogFileName = tempfolder & "\" & IP & "-VID.txt"
    'MsgBox tempfolder

    if Login(IP) then
	    RunCommand()

        ' 获取桌面地址
        dim WshShell, strDesktop
        set WshShell = CreateObject("wscript.shell")
        strDesktop = WshShell.SpecialFolders("Desktop")
        dateTime = date()
        dateTime = Replace(dateTime,"/","-")
        ' 创建excel文件
        createExcel strDesktop & "\" & dateTime & "-" & IP & ".xlsx", szIntlogFileName, szVIDlogFileName

        dim tmpFile, fso1
        set fso1 = CreateObject("Scripting.FileSystemObject")       
        set tmpFile = fso1.GetFile(szIntlogFileName)
        tmpFile.Delete
        set tmpFile = fso1.GetFile(szVIDlogFileName)
        tmpFile.Delete

        MsgBox "Create " & strDesktop & "\" & dateTime & "-" & IP & ".xlsx" & " successful!"

        'IP = InputBox("Enter IP address : " & vbcr & "(Quit enter 0)")
    else
        MsgBox("Login failed !")
    end if
end sub

'------------------------------------------------------------------------------------------------------'
'Login子函数(登录检测)
function Login(IP)
	'函数返回值
	Login = True	

	'登录方式
	Login = SSH2Connect(IP)
	if NOT Login then
		Login = TelnetConnect(IP)
	end if 
	
'MsgBox Login
	
'返回主函数
End function

'------------------------------------------------------------------------------------------------------'
function SSH2Connect(IP)

	'函数返回值
	SSH2Connect = True
    'crt.Session.LogFileName = szlogFileName
	'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.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.Disconnect
	Else    
		Select Case crt.Screen.WaitForStrings("username",10)
		'输入用户名和密码
			Case 1
				Crt.Screen.Send UserName2
				crt.Screen.Send vbcr
				Crt.Screen.WaitForString("assword")
				Crt.Screen.Send(PassWord1 & vbcr)
				Crt.Screen.Send vbCr
				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()

    crt.Session.LogFileName = szIntlogFileName
    Crt.Session.Log(true)
	'执行命令
	crt.Screen.Send "sh int"
    crt.Screen.Send vbcr
	'超过屏幕时,按空格
	Do While (crt.Screen.WaitForString("More",waitingForCmd) = True)
		crt.Screen.Send(" ")
	Loop 
	Crt.Session.Log(false)
    crt.Sleep 100
	crt.Session.LogFileName = szVIDlogFileName
    Crt.Session.Log(true)
	'执行命令
    crt.Screen.Send "sh int status"
    crt.Screen.Send vbcr
	'超过屏幕时,按空格
	Do While (crt.Screen.WaitForString("More",waitingForCmd) = True)
		crt.Screen.Send(" ")
	Loop 
    Crt.Session.Log(false)

	crt.Session.Disconnect
	
'返回Login子函数

End Sub

'------------------------------------------------------------------------------------------------------'
' 创建ExcelMain
function createExcel(excelFileName, intlogFileName, VIDlogFileName)
	createExcel = true
    createExcelHeard excelFileName, intlogFileName, VIDlogFileName
end function

'------------------------------------------------------------------------------------------------------'
' 创建Excel
' A         B               C                       D           E               F           G               H
' 10.93.1.1	Interface	    Link	                Protocol	State	        Last input	Last output     VLAN ID
'           vlan1	        administratively down	down 	    notconnect	    0:00:00	    never           
'           FastEthernet0/1	down	                down 	    notconnect 	    never	    never           59
function createExcelHeard(excelFileName, intlogFileName, VIDlogFileName)

	createExcelHeard = true

    dim objExcelApp, objExcelBook, objExcelSheet 
    set objExcelApp = CreateObject("excel.application")
    set objExcelBook = objExcelApp.WorkBooks.Add
    set objExcelSheet = objExcelBook.ActiveSheet
    '------------------------------------------
    ' 先处理接口普通信息
    dim fso, objLogFile
    set fso = CreateObject("Scripting.FileSystemObject")
    set objLogFile = fso.OpenTextFile(intlogFileName,Read,false)

    ' 生成表头
    '
    objExcelSheet.Cells(1,1) = IPADDR
    objExcelSheet.Cells(1,2) = "Interface"
    objExcelSheet.Cells(1,3) = "Link"
    objExcelSheet.Cells(1,4) = "Protocol"
    objExcelSheet.Cells(1,5) = "State"
    objExcelSheet.Cells(1,6) = "Last input"
    objExcelSheet.Cells(1,7) = "Last output"

    dim flag, row, column
    flag = true
    ' 行
    row = 2
    ' 列
    column = 2

    do while objLogFile.AtEndOfStream <> true
        szline = objLogFile.ReadLine
        if flag then
            ' interface/Link/Protocol/state  这些信息在一行
            if InStr(szline, "protocol") then
                tmp = InStr(szline,"drops")
                if tmp = 0 then
                    objExcelSheet.Cells(row,column) = getInterface(szline)
                    column = column + 1
                    objExcelSheet.Cells(row,column) = getLink(szline)
                    column = column + 1
                    objExcelSheet.Cells(row,column) = getProtocol(szline)
                    column = column + 1
                    objExcelSheet.Cells(row,column) = getState(szline)
                    column = column + 1
                    flag = not flag
                end if
            end if
        else
            ' Last input/Last output         这些信息在一行
            if InStr(szline, "Last input") then
                objExcelSheet.Cells(row,column) = getLastInput(szline)
                column = column + 1
                objExcelSheet.Cells(row,column) = getLastOutput(szline)
                column = 2

                flag = not flag
                row = row + 1
            end if
        end if
        
    loop
    '------------------------------------------
    ' 再处理VLAN ID信息
    set objLogFile = fso.OpenTextFile(VIDlogFileName,Read,false)
    objExcelSheet.Cells(1,8) = "VLAN ID"

    dim NameLk, StatusLK

    flag = false
    dim flag2
    flag2 = false
    column = 2
    objLogFile.ReadLine
    objLogFile.ReadLine
    do while objLogFile.AtEndOfStream <> true
        szline = objLogFile.ReadLine
'msgbox szline
'msgbox "282"
        ' 定位标题行,用于计算接口注释位置(为了检测是否有注释)
        if NOT flag then
'msgbox "285"
            if InStr(szline,"ort") then 
                NameLk = InStr(szline, "Name")
'msgbox "NameLk: " & NameLk 
                StatusLK = InStr(szline, "Status")
                flag = true
            end if 
        end if
        ' 关键信息行定位
        if keyLine(szline) then
            ' 定位EXCEL中应该写在什么位置(一次性)
            if NOT flag2 then
                for row = 2 to 100
                ' 取出前两个字符 Gi
'msgbox "298"
                    if InStr(objExcelSheet.cells(row,column), Mid(szline, 1, 2)) = 1 then 
                        flag2 = true
                        column = 8
                        exit for
                    end if 
                next
            end if 
            ' 检测是否有注释,Gi4/3     To-P2-6500         inactive     1            full   1000 No Gbic
            szlineLen = Len(szline)
'msgbox "308"
            tmpMid = Mid(szline, NameLk, 1)
            if inStr(tmpMid," ") = 1 then   ' 没注释
                vlanID = vlanIDFunction(szline, szlineLen) 
                objExcelSheet.cells(row,column) = vlanID(2)
            else                                            ' 有注释
                vlanID = vlanIDFunction(szline, szlineLen)
                objExcelSheet.cells(row,column) = vlanID(3) 
            end if
            row = row + 1 
        end if
    loop
    objExcelBook.SaveAs(excelFileName)
    '设置颜色

     ' 行
    row = 2
    ' 列
    column = 6

    do while objExcelSheet.cells(row,column) <> ""
'MsgBox objExcelSheet.cells(row,column)
        if inStr(objExcelSheet.cells(row,column),"never") then
            if objExcelSheet.cells(row,column + 1) = "never" then
                objExcelSheet.cells(row,column).Interior.color = RGB(255,0,0)
                objExcelSheet.cells(row,column + 1).Interior.color = RGB(255,0,0)
                objExcelSheet.cells(row, 2).Interior.color = RGB(255,0,0)
            end if
        end if
        row = row + 1
    loop

    for i = 65 to 90
        objExcelSheet.Columns(chr(i)).AutoFit
        '设置水平对齐,1常规,2靠左,3居中,4靠右
        objExcelSheet.Columns(chr(i)).HorizontalAlignment = 2
    next

    objExcelBook.Save
    objExcelBook.Close
    objExcelApp.Quit

end function

'------------------------------------------------------------------------------------------------------'
' VLAN ID处理
'------------------------------------------------------------------------------------------------------'
' 判断是否有关键信息
function keyLine(szline)
    keyLine = true
    if InStr(szline,"#") then
        keyLine = false
    end if
    if InStr(szline,"ort") then
        keyLine = false
    end if
    if InStr(szline, " ") = 1 then
        keyLine = false
    end if
end function

'------------------------------------------------------------------------------------------------------'
'
function vlanIDFunction(szline,szlineLen)
    for i = szlineLen to 2 step -1
        szchars = space(i)
        szline = Replace(szline,szchars, " ")
    next
    vlanIDFunction = Split(szline," ")
end function 

'------------------------------------------------------------------------------------------------------'
' 词法分析

'------------------------------------------------------------------------------------------------------'
' 获得Interface
' FastEthernet0/1 is down, line protocol is down (notconnect) 
function getInterface(szline)
    dim interface
    interface = Split(szline," ")
    getInterface = interface(0)
end function

'------------------------------------------------------------------------------------------------------'
' 获得Link
' FastEthernet0/1 is down, line protocol is down (notconnect) 
' Vlan999 is up, line protocol is up 
' Vlan1 is administratively down, line protocol is down 
function getLink(szline)
    dim link
    tmpLink = Split(szline,",")
    link = Split(tmpLink(0),"is ")
    getLink = link(UBound(link))
end function

'------------------------------------------------------------------------------------------------------'
' 获得Protocol
' FastEthernet0/1 is down, line protocol is down (notconnect) 
' Vlan999 is up, line protocol is up 
' Vlan1 is administratively down, line protocol is down 
function getProtocol(szline)
    dim protocol
    tmpProtocol1 = Split(szline,",")
    tmpProtocol2 = Split(tmpProtocol1(1),"is ")
    protocol = Split(tmpProtocol2(1),"(")
    getProtocol = protocol(0)
end function

'------------------------------------------------------------------------------------------------------'
' 获得State
' FastEthernet0/1 is down, line protocol is down (notconnect) 
' Vlan999 is up, line protocol is up 
' Vlan1 is administratively down, line protocol is down 
function getState(szline)
    dim state
    if InStr(szline,"(") then
        tmpState1 = Split(szline,"(")
        tmpState2 = tmpState1(UBound(tmpState1))
        state = Split(tmpState2,")")
        getState = state(0)
    else
        getState = "N/A"
    end if
end function

'------------------------------------------------------------------------------------------------------'
' 获得Last input
'  Last input 00:00:00, output never, output hang never
'  Last input 00:00:00, output 00:00:00, output hang never
'  Last input never, output never, output hang never
function getLastInput(szline)
    dim lastInput
    tmpLastInput1 = Split(szline,",")
    ' 第一段
    lastInput = Split(tmpLastInput1(0)," ")
    getLastInput = lastInput(UBound(lastInput))
end function

'------------------------------------------------------------------------------------------------------'
' 获得Last output
'  Last input 00:00:00, output never, output hang never
'  Last input 00:00:00, output 00:00:00, output hang never
'  Last input never, output never, output hang never
function getLastOutput(szline)
    dim lastOutput
    tmpLastOutput1 = Split(szline,",")
    ' 第二段
    lastOutput = Split(tmpLastOutput1(1)," ")
    getLastOutput = lastOutput(UBound(lastOutput))
end function

'------------------------------------------------------------------------------------------------------'

'2018.1.19
'1.0.0
'自动登录,自动识别SSH,TELNET
'自动收集接口信息,生成excel
'其中包含VLAN ID


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值