So heute gibts mal wieder eine kleine Hilfestellung für mich, damit ich es nicht wieder vergesse. Die selbstgestellte Aufgabe bestand darin mit
SecureCRT die Passwörter unserer Cisco Geräte regelmäßig zu aktualisieren und eine kleine Inventur zu machen, was die Seriennummern der Switche Router Firewalls angeht. Da man sich aber nicht an jedem Cisco Switch einzeln anmelden will musste ein VB Script her, was die vordefinierten Sessions automatisch aufruft, die Passwörter ändert und die Session wieder schließt.
Ich hab zwar ein
Script gefunden welches die Passwörter ändern kann aber hier muss man wissen, welches Protokoll benutzt wird, Telnet oder SSH, und man musste die alten Passörter mitgeben. Da wir aber teilweise unterschiedliche Passwörter verwenden wurde das Script soweit angepasst, das es die bereits gespeicherten Sessions aufruft. Um sicher zu gehen, dass auch alle gespeicherten Sessions in SecureCRT auch funktionieren musste auch dies noch geprüft werden.
Zusammen genommen habe ich nur drei Scripte, welche folgende Aufgaben erledigen. CheckSession.vbs prüft ob überhaupt eine Verbindung zu dem Gerät aufgebaut werden kann und man sieht ob ein automatischer Login stattfindet oder eben auch nicht. Das zweite Script MassChangeCiscoPassword.vbs ändert die Passwörter auf den den Cisco Switchen Router Firewall whatever. Das dritte Script GetCiscoSerial.vbs liest die Seriennummer und den Hostname des Cisco Gerätes aus schreibt diese in eine Datei weg.
Hinweis: Es wird für alle Scripte eine Datei session.txt benötigt, die die Pfade und die Namen zu den gespeicherten Sessions anzeigt. Über die Dos Box kann man sich alles schnell in eine Datei ausgeben lassen und muss dies dann nur noch bereinigen, was mit suchen/ersetzen schnell gemacht ist. Der Befehl über die Dosbos wäre dann "dir /B /S > c:\session.txt".
CheckSession.zip
CheckSession.vbs
#$language = "VBScript"
#$interface = "1.0"
'==========================================================================
' NAME: Check Session
' AUTHOR: Eike Scholz-Janotte
' DATE : 2/17/2010
'==========================================================================
Option Explicit
Dim g_nSecondTimeout
g_nSecondTimeout = 15
Dim result
Dim g_nRow, g_nCol
Dim g_szRow
Dim g_nCurrentValue
Dim g_Hostname
Dim g_SerialNumber
Sub Main
Dim fs, ts, ts2, sLine, sMaybehostname
Set fs = CreateObject("Scripting.FileSystemObject")
Set ts = fs.OpenTextFile("c:\session.txt")
Crt.Screen.Synchronous = TRUE
While Not ts.AtEndOfStream
sLine = ts.ReadLine
If Len(sLine) > 0 And InStr(sLine, "_FolderData_") = 0 Then
Crt.Session.Disconnect
On Error Resume Next
Crt.Session.Connect "/S " & sLine
On Error Goto 0
If Crt.Session.Connected Then
Crt.Screen.WaitForStrings "Maybe we need to wait for n seconds to complete the logon", 3
MsgBox "connected"
Crt.Session.Disconnect
End If
End If
WEnd
Crt.Screen.Synchronous = FALSE
End Sub
MassChangeCiscoPassword.zip
MassChangeCiscoPassword.vbs
#$language = "VBScript"
#$interface = "1.0"
'==========================================================================
' NAME: Cisco Password Changer
' AUTHOR: Eike Scholz-Janotte
' DATE : 2/17/2010
'==========================================================================
Option Explicit
Dim g_nSecondTimeout
g_nSecondTimeout = 15
Dim result
Dim g_nRow, g_nCol
Dim g_szRow
Dim g_nCurrentValue
Dim g_Hostname
Dim g_SerialNumber
Sub Main
Const newUserPass = "" 'new password for CiscoAdmin
Const newEnablePass = "" ' New Enable password to set
Dim fs, ts, ts2, sLine, sMaybehostname
Dim index
Set fs = CreateObject("Scripting.FileSystemObject")
Set ts = fs.OpenTextFile("C:\session.txt")
Crt.Screen.Synchronous = TRUE
While Not ts.AtEndOfStream
sLine = ts.ReadLine
If Len(sLine) > 0 And InStr(sLine, "__FolderData_") = 0 Then
Crt.Session.Disconnect
On Error Resume Next
Crt.Session.Connect "/S " & sLine
On Error Goto 0
If Crt.Session.Connected Then
' Enable
index = crt.Screen.WaitForStrings(">", "#")
If index = 1 Then
crt.Screen.WaitForString ">"
crt.Screen.Send "en" & vbCr
crt.Screen.WaitForString "Password:"
crt.Screen.Send EnablePass & vbCr
End If
'crt.Screen.WaitForString "#"
crt.Screen.Send "conf t" & vbCr
crt.Screen.WaitForString "(config)#"
' change enable password
crt.Screen.Send "enable secret " & newEnablePass & vbCr
crt.Screen.WaitForString "(config)#"
' Change or add username password
crt.Screen.Send "username test privileg 15 password " & newUserPass & vbCr
crt.Screen.WaitForString "(config)#"
' Change console password
'crt.Screen.Send "line con 0" & vbCr
'crt.Screen.WaitForString "(config-line)#"
'crt.Screen.Send "password " & newLoginPass & vbCr
'crt.Screen.WaitForString "(config-line)#"
'crt.Screen.Send "exit" & vbCr
'crt.Screen.WaitForString "(config)#"
' Save
crt.Screen.Send "exit" & vbCr
crt.Screen.WaitForString "#"
crt.Screen.Send "copy run start" & vbCr
crt.Screen.WaitForString "startup-config"
crt.Screen.Send vbCr
crt.Screen.WaitForString "#"
'cisconnect session
Crt.Session.Disconnect
MsgBox "done"
End If
End If
WEnd
Crt.Screen.Synchronous = FALSE
End Sub
GetCiscoSerial.zip
GetCiscoSerial.vbs
#$language = "VBScript"
#$interface = "1.0"
'==========================================================================
' NAME: Cisco Serialnumber
' AUTHOR: Eike Scholz-Janotte
' DATE : 2/17/2010
'==========================================================================
Option Explicit
Dim g_nSecondTimeout
g_nSecondTimeout = 15
Dim result
Dim g_nRow, g_nCol
Dim g_szRow
Dim g_nCurrentValue
Dim g_Hostname
Dim g_SerialNumber
Sub Main
Dim fs, ts, ts2, sLine, sMaybehostname
Set fs = CreateObject("Scripting.FileSystemObject")
Set ts = fs.OpenTextFile("C:\session.txt")
Crt.Screen.Synchronous = TRUE
While Not ts.AtEndOfStream
sLine = ts.ReadLine
If Len(sLine) > 0 And InStr(sLine, "__FolderData_") = 0 Then
Crt.Session.Disconnect
On Error Resume Next
Crt.Session.Connect "/S " & sLine
On Error Goto 0
If Crt.Session.Connected Then
Crt.Screen.WaitForStrings "whyever we need to wait n seconds to complete the logon", 5
Crt.Screen.SendKeys "show version" & chr(13)
result = Crt.Screen.WaitForStrings("Cisco", g_nSecondTimeout)
If result = 1 Then
g_nRow = Crt.Screen.CurrentRow - 1
g_Hostname = ParseHostName(Crt.Screen.Get( g_nRow, 1, g_nRow, Crt.Screen.Columns ))
result = Crt.Screen.WaitForStrings (chr(10), chr(13), g_nSecondTimeout)
End If
result = Crt.Screen.WaitForStrings ("board ID ", g_nSecondTimeout)
If result = 1 Then
g_nRow = Crt.Screen.CurrentRow
result = 0
result = Crt.Screen.WaitForStrings (chr(10), chr(13), g_nSecondTimeout)
if result = 1 Then
' Found end of line
g_szRow = Crt.Screen.Get( g_nRow, 1, g_nRow, Crt.Screen.Columns )
'MsgBox "Text on current value line: " & vbcr & g_szRow ' Debug
'g_CurrentValue = ParseOutNumber(g_szRow)
g_SerialNumber = ParseOutNumber(g_szRow)
elseif result = 2 Then
' Found end of line
g_szRow = Crt.Screen.Get( g_nRow, 1, g_nRow, Crt.Screen.Columns )
'MsgBox "Text on current value line: " & vbcr & g_szRow ' Debug
g_SerialNumber = ParseOutNumber(g_szRow)
'g_CurrentValue = ParseOutNumber(g_szRow)
Elseif result = 0 Then
MsgBox "Timed out waiting for end of line"
End if
Elseif result = 0 Then
MsgBox "Timed out waiting for current value string"
End if
If Len(g_Hostname) = 0 Or Len(g_SerialNumber) = 0 Then
MsgBox "Hostname or Serial is missing"
Else
Set ts2 = fs.OpenTextFile("C:\collected_serial.txt", 8, True)
ts2.WriteLine g_Hostname & ";" & g_SerialNumber
ts2.Close
End If
End If
End If
WEnd
Crt.Screen.Synchronous = FALSE
End Sub
Function ParseHostName(szText)
Dim hashPos
hashPos = InStr(szText, "#")
If hashPos > 0 Then
ParseHostName = Left(szText, hashPos - 1)
End If
End Function
Function ParseOutNumber(szText)
Dim szTextArray
Dim i, nElements, nNumberWeWant
i=1
nNumberWeWant = -1
If LCase(Left(szText, Len("Processor Board ID"))) = "processor board id" Then
i = InStr(szText, ",")
If i = 0 Then
ParseOutNumber = Trim(Mid(szText, Len("Processor Board ID") + 1))
Else
ParseOutNumber = Trim(Mid(szText, Len("Processor Board ID") + 1, i - (Len("Processor Board ID") + 1)))
End If
End If
End Function