在Xshell可以像这样一个文件批量导入主机:
https://blog.netsarang.com/91/importing-csv-formatted-host-information-to-xshell/
在CRT上也可以,格式和Xshell的一样,但前提是需要运行一个自定义脚本:
脚本:https://forums.vandyke.com/showthread.php?p=37089#post37089
操作:https://www.vandyke.com/support/tips/importsessions.html
视频操作:https://youtu.be/f7nMFYhGoiI
简单操作步骤:
脚本文件内容:
ImportArbitraryDataFromFileToSecureCRTSessions.vbs
# $language = "VBScript" # $interface = "1.0" ' ImportArbitraryDataFromFileToSecureCRTSessions.txt ' (Designed for use with SecureCRT 7.2 and later) ' ' Last Modified: 23 Feb, 2018 ' - Warn user if the configuration folder appears to be read-only. ' - Fall back to secondary locations in which to attempt to write ' the results log file in case the user's Documents, Desktop, or ' configuration folder are all read-only or otherwise un-write-able ' for the user. ' ' Last Modified: 21 Dec, 2017 ' - Allow multiple 'description' fields on the same line. All will be ' compounded together with each one ending up on a separate line in ' the Session's Description session option. ' - Allow 'username' field to be defaulted in the header line ' - Allow 'folder' field to be defaulted in the header line ' - Duplicate sessions are now imported with unique time-stamped ' names (for each additional duplicate). Earlier versions of this ' script would overwrite the first duplicate with any subsequent ' duplicates that were found in the data file. ' - When displaying the browse dialog, filter now includes both ' CSV and TXT file types, to make it easier to find the data file ' (less clicking). ' - Allow for protocol field to be defaulted, if not present in the ' header line. ' - Fix error messages relating to invalid header lines so they no ' longer indicate Protocol is a required field. If it's not present ' the Default Session's protocol value will be used. ' - Allow header fields to be case-insensitive so that "Description" ' and "UserName" work just the same as "description" and "username" ' ' Last Modified: 09 Aug, 2017 ' - Changed from using CInt to CLng in order to support port ' specifications larger than 32768 (max integer supported in VBScript) ' ' Last Modified: 20 Feb, 2017 ' - Added progress info to status bar ' - When a line from the source file has bogus/incomplete data on it, ' the script no longer halts operation, but instead, continues the ' import process for all remaining legitimate lines, skipping any ' lines that don't have sufficient/accurate format. ' - Changed format of summary message shown at end to include header ' line so entries that were skipped can be easily copied into a new ' document to be imported. ' - Toggle the Session Manager automatically so that imported sessions ' are more immediately visible in the Session Manager. ' ' Last Modified: 20 Jan, 2015 ' - Combined TAPI protocol handling (which is no longer ' supported for mass import) with Serial protocol ' import errors. ' - Enhanced example .csv file data to show subfolder specification. ' ' Last Modified: 21 Mar, 2012 ' - Initial version for public forums ' ' DESCRIPTION ' This sample script is designed to create sessions from a text file (.csv ' format by default, but this can be edited to fit the format you have). ' ' To launch this script, map a button on the button bar to run this script: ' http://www.vandyke.com/support/tips/buttonbar.html ' ' The first line of your data file should contain a comma-separated (or whatever ' you define as the g_strDelimiter below) list of supported "fields" designated ' by the following keywords: ' ----------------------------------------------------------------------------- ' session_name: The name that should be used for the session. If this field ' does not exist, the hostname field is used as the session_name. ' folder: Relative path for session as displayed in the Connect dialog. ' hostname: The hostname or IP for the remote server. ' protocol: The protocol (SSH2, SSH1, telnet, rlogin) ' port: The port on which remote server is listening ' username: The username for the account on the remote server ' emulation: The emulation (vt100, xterm, etc.) ' description: The comment/description. Multiple lines are separated with ' ' ' ============================================================================= ' ' ' As mentioned above, the first line of the data file instructs this script as ' to the format of the fields in your data file and their meaning. It is not a ' requirement that all the options be used. For example, notice the first line ' of the following file only uses the "hostname", "username", and "protocol" ' fields. Note also that the "protocol" field can be defaulted so that if a ' protocol field is empty it will use the default value. ' ----------------------------------------------------------------------------- ' hostname,username,folder,protocol=SSH2 ' 192.168.0.1,root,_imported,SSH1 ' 192.168.0.2,admin,_imported,SSH2 ' 192.168.0.3,root,_importedfolderA, ' 192.168.0.4,root,, ' 192.168.0.5,admin,_importedfolderB,telnet ' ... and so on ' ============================================================================= ' ' ' The g_strDefaultProtocol variable will only be defined within the ' ValidateFieldDesignations function if the protocol field has a default value ' (e.g., protocol=SSH2), as read in from the first line of the data file. Dim g_strDefaultProtocol ' The g_strDefaultFolder variable will only be defined within the ' ValidateFieldDesignations function if the folder field has a default value ' (e.g., folder=Site34), as read in from the first line of the data file. Dim g_strDefaultFolder ' The g_strDefaultUsername variable will only be defined within the ' ValidateFieldDesignations function if the username field has a default value ' (e.g., username=bensolo), as read in from the first line of the data file. Dim g_strDefaultUsername ' If your data file uses spaces or a character other than comma as the ' delimiter, you would also need to edit the g_strDelimiter value a few lines ' below to indicate that fields are separated by spaces, rather than by commas. ' For example: ' g_strDelimiter = " " ' Using a ";" might be a good alternative for a file that includes the comma ' character as part of any legitimate session name or folder name, etc. Dim g_strDelimiter g_strDelimiter = "," ' comma ' g_strDelimiter = " " ' space ' g_strDelimiter = ";" ' semi-colon ' g_strDelimiter = chr(9) ' tab ' g_strDelimiter = "|||" ' a more unique example of a delimiter. ' The g_strSupportedFields indicates which of all the possible fields, are ' supported in this example script. If a field designation is found in a data ' file that is not listed in this variable, it will not be imported into the ' session configuration. Dim g_strSupportedFields g_strSupportedFields = _ "description,emulation,folder,hostname,port,protocol,session_name,username" ' If you wish to overwrite existing sessions, set the ' g_bOverwriteExistingSessions to True; for this example script, we're playing ' it safe and leaving any existing sessions in place :). Dim g_bOverwriteExistingSessions g_bOverwriteExistingSessions = False Dim g_fso, g_shell Set g_fso = CreateObject("Scripting.FileSystemObject") Set g_shell = CreateObject("WScript.Shell") Const ForReading = 1 Const ForWriting = 2 Const ForAppending = 8 Dim g_strHostsFile, g_strExampleHostsFile, g_strMyDocs, g_strMyDesktop g_strMyDocs = g_shell.SpecialFolders("MyDocuments") g_strMyDesktop = g_shell.SpecialFolders("Desktop") g_strHostsFile = g_strMyDocs & "MyDataFile.csv" g_strExampleHostsFile = _ vbtab & "hostname,protocol,username,folder,emulation" & vbcrlf & _ vbtab & "192.168.0.1,SSH2,root,Linux Machines,XTerm" & vbcrlf & _ vbtab & "192.168.0.2,SSH2,root,Linux Machines,XTerm" & vbcrlf & _ vbtab & "..." & vbcrlf & _ vbtab & "10.0.100.1,SSH1,admin,CISCO Routers,VT100" & vbcrlf & _ vbtab & "10.0.101.1,SSH1,admin,CISCO Routers,VT100" & vbcrlf & _ vbtab & "..." & vbcrlf & _ vbtab & "myhost.domain.com,SSH2,administrator,Windows Servers,VShell" & _ vbtab & "..." & vbcrlf g_strExampleHostsFile = Replace(g_strExampleHostsFile, ",", g_strDelimiter) Dim g_strConfigFolder, strFieldDesignations, vFieldsArray, vSessionInfo g_strConfigFolder = GetConfigPath() Dim strSessionName, strHostName, strPort Dim strUserName, strProtocol, strEmulation Dim strPathForSessions, strLine, nFieldIndex Dim strSessionFileName, strFolder, nDescriptionLineCount, strDescription Dim g_strLastError, g_strErrors, g_strSessionsCreated Dim g_nSessionsCreated, g_nDataLines g_strDateTimeTag = GetDateTimeTag() g_strBogusLinesNotImported = "" Import '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sub Import() g_strHostsFile = crt.Dialog.FileOpenDialog( _ "Please select the host data file to be imported.", _ "Open", _ g_strHostsFile, _ "CSV/Text Files (*.txt;*.csv)|*.txt;*.csv|All files (*.*)|*.*") If g_strHostsFile = "" Then Exit Sub End If ' Open our data file for reading Dim objDataFile Set objDataFile = g_fso.OpenTextFile(g_strHostsFile, ForReading, False) ' Now read the first line of the data file to determine the field ' designations On Error Resume Next strFieldDesignations = objDataFile.ReadLine() nError = Err.Number strErr = Err.Description On Error Goto 0 If nError <> 0 Then If nError = 62 Then crt.Dialog.MessageBox("Your data file is empty." & vbcrlf & _ "Fill it with import data and try again." & vbcrlf & vbcrlf & _ "ReadLine() Error code: " & nError & vbcrlf & _ "ReadLine() Error text: " & strErr) Else crt.Dialog.MessageBox("Unable to read the first line from your data file!" & _ vbcrlf & vbcrlf & _ "ReadLine() Error code: " & nError & vbcrlf & vbcrlf & _ "ReadLine() Error text: " & strErr) End If Exit Sub End If ' Validate the data file If Not ValidateFieldDesignations(strFieldDesignations) Then objDataFile.Close Exit Sub End If ' Get a timer reading so that we can calculate how long it takes to import. nStartTime = Timer ' Here we create an array of the items that will be used to create the new ' session, based on the fields separated by the delimiter specified in ' g_strDelimiter vFieldsArray = Split(strFieldDesignations, g_strDelimiter) ' Loop through reading each line in the data file and creating a session ' based on the information contained on each line. Do While Not objDataFile.AtEndOfStream strLine = "" strLine = objDataFile.ReadLine crt.Session.SetStatusText "Processing line #: " & _ NN(objDataFile.Line - 1, 4) ' This sets v_File Data array elements to each section of strLine, ' separated by the delimiter vSessionInfo = Split(strLine, g_strDelimiter) If UBound(vSessionInfo) < UBound(vFieldsArray) Then If Trim(strLine) <> "" Then g_strErrors = g_strErrors & vbcrlf & _ "Insufficient data on line #" & _ NN(objDataFile.Line - 1, 4) & ": " & strLine Else g_strErrors = g_strErrors & vbcrlf & _ "Insufficient data on line #" & _ NN(objDataFile.Line - 1, 4) & ": [Empty Line]" End If ElseIf UBound(vSessionInfo) > UBound(vFieldsArray) Then g_strErrors = g_strErrors & vbcrlf & _ "==> Number of data fields on line #" & _ NN(objDataFile.Line - 1, 4) & _ "(" & UBound(vSessionInfo) & ") " & _ "does not match the number of fields in the header " & _ "(" & UBound(vFieldsArray) & ")." & vbcrlf & _ " This line will not be imported (Does the session name have a character that " & _ "matches the delimiter you're using? Also check for characters that Windows does not " & _ "allow to be used in filenames: /:*?""<>|): " & vbcrlf & vbtab & strLine g_strBogusLinesNotImported = g_strBogusLinesNotImported & _ vbcrlf & strLine Else ' Variable used to determine if a session file should actually be ' created, or if there was an unrecoverable error (and the session ' should be skipped). Dim bSaveSession bSaveSession = True ' Now we will match the items from the new file array to the correct ' variable for the session's ini file For nFieldIndex = 0 To UBound(vSessionInfo) Select Case LCase(vFieldsArray(nFieldIndex)) Case "session_name" strSessionName = vSessionInfo(nFieldIndex) ' Check folder name for any invalid characters Dim re Set re = New RegExp re.Pattern = "[\|/:*?""<>]" If re.Test(strSessionName) Then bSaveSession = False If g_strErrors <> "" Then g_strErrors = _ vbcrlf & g_strErrors g_strErrors = _ "Error: " & _ "Invalid characters found in SessionName """ & _ strSessionName & """ specified on line #" & _ NN(objDataFile.Line - 1, 4) & _ ": " & strLine & g_strErrors g_strBogusLinesNotImported = g_strBogusLinesNotImported & _ vbcrlf & strLine End If Case "port" strPort = Trim(vSessionInfo(nFieldIndex)) If Not IsNumeric(strPort) Then bSaveSession = False If g_strErrors <> "" Then g_strErrors = _ vbcrlf & g_strErrors g_strErrors = _ "Error: Invalid port """ & strPort & _ """ specified on line #" & _ NN(objDataFile.Line - 1, 4) & _ ": " & strLine & g_strErrors g_strBogusLinesNotImported = g_strBogusLinesNotImported & _ vbcrlf & strLine End If Case "protocol" strProtocol = Trim(lcase(vSessionInfo(nFieldIndex))) Select Case strProtocol Case "ssh2" strProtocol = "SSH2" Case "ssh1" strProtocol = "SSH1" Case "telnet" strProtocol = "Telnet" Case "serial", "tapi" bSaveSession = False g_strErrors = g_strErrors & vbcrlf & _ "Error: Unsupported protocol """ & _ vSessionInfo(nFieldIndex) & _ """ specified on line #" & _ NN(objDataFile.Line - 1, 4) & _ ": " & strLine Case "rlogin" strProtocol = "RLogin" Case Else If g_strDefaultProtocol <> "" Then strProtocol = g_strDefaultProtocol Else bSaveSession = False If g_strErrors <> "" Then g_strErrors = _ vbcrlf & g_strErrors g_strErrors = _ "Error: Invalid protocol """ & _ vSessionInfo(nFieldIndex) & _ """ specified on line #" & _ NN(objDataFile.Line - 1, 4) & _ ": " & strLine & g_strErrors g_strBogusLinesNotImported = g_strBogusLinesNotImported & _ vbcrlf & strLine End If End Select ' for protocols Case "hostname" strHostName = Trim(vSessionInfo(nFieldIndex)) If strHostName = "" Then bSaveSession = False g_strErrors = g_strErrors & vbcrlf & _ "Warning: 'hostname' field on line #" & _ NN(objDataFile.Line - 1, 4) & _ " is empty: " & strLine g_strBogusLinesNotImported = g_strBogusLinesNotImported & _ vbcrlf & strLine End If Case "username" strUserName = Trim(vSessionInfo(nFieldIndex)) Case "emulation" strEmulation = LCase(Trim(vSessionInfo(nFieldIndex))) Select Case strEmulation Case "xterm" strEmulation = "Xterm" Case "vt100" strEmulation = "VT100" Case "vt102" strEmulation = "VT102" Case "vt220" strEmulation = "VT220" Case "ansi" strEmulation = "ANSI" Case "linux" strEmulation = "Linux" Case "scoansi" strEmulation = "SCOANSI" Case "vshell" strEmulation = "VShell" Case "wyse50" strEmulation = "WYSE50" Case "wyse60" strEmulation = "WYSE60" Case Else bSaveSession = False g_strErrors = g_strErrors & vbcrlf & _ "Warning: Invalid emulation """ & _ strEmulation & """ specified on line #" & _ NN(objDataFile.Line - 1, 4) & _ ": " & strLine g_strBogusLinesNotImported = g_strBogusLinesNotImported & _ vbcrlf & strLine End Select Case "folder" strFolder = Trim(vSessionInfo(nFieldIndex)) ' Check folder name for any invalid characters ' Note that a folder can have subfolder designations, ' so '/' is a valid character for the folder (path). Set re = New RegExp re.Pattern = "[|:*?""<>]" If re.Test(strFolder) Then bSaveSession = False If g_strErrors <> "" Then g_strErrors = _ vbcrlf & g_strErrors g_strErrors = _ "Error: Invalid characters in folder """ & _ strFolder & """ specified on line #" & _ NN(objDataFile.Line - 1, 4) & _ ": " & strLine & g_strErrors g_strBogusLinesNotImported = g_strBogusLinesNotImported & _ vbcrlf & strLine End If Case "description" strCurDescription = Trim(vSessionInfo(nFieldIndex)) If strDescription = "" Then strDescription = strCurDescription Else strDescription = strDescription & " " & strCurDescription End If Case Else ' If there is an entry that the script is not set to use ' in strFieldDesignations, stop the script and display a ' message Dim strMsg1 strMsg1 = "Error: Unknown field designation: " & _ vFieldsArray(nFieldIndex) & vbcrlf & vbcrlf & _ " Supported fields are as follows: " & _ vbcrlf & vbcrlf & vbtab & g_strSupportedFields & _ vbcrlf & _ vbcrlf & " For a description of " & _ "supported fields, please see the comments in " & _ "the sample script file." If Trim(g_strErrors) <> "" Then strMsg1 = strMsg1 & vbcrlf & vbcrlf & _ "Other errors found so far include: " & _ g_strErrors End If MsgBox strMsg1, _ vbOkOnly, _ "Import Data To SecureCRT Sessions: Data File Error" Exit Sub End Select Next If bSaveSession Then ' Use hostname if a session_name field wasn't present If strSessionName = "" Then strSessionName = strHostName End If If strFolder = "" Then strFolder = g_strDefaultFolder End If ' Canonicalize the path to the session, as needed strSessionPath = strSessionName If strFolder <> "" Then strSessionPath = strFolder & "/" & strSessionName End If ' Strip any leading '/' characters from the session path If Left(strSessionPath, 1) = "/" Then strSessionPath = Mid(strSessionPath, 2) End If If SessionExists(strSessionPath) Then If Not g_bOverwriteExistingSessions Then ' Append a unique tag to the session name, if it already exists strSessionPath = strSessionPath & _ "(import_" & GetDateTimeTag & ")" End If End If ' Now: Create the session. ' Copy the default session settings into new session name and set the ' protocol. Setting protocol protocol is essential since some variables ' within a config are only available with certain protocols. For example, ' a telnet configuration will not be allowed to set any port forwarding ' settings since port forwarding settings are specific to SSH. Set objConfig = crt.OpenSessionConfiguration("Default") If strProtocol = "" Then strProtocol = g_strDefaultProtocol End If objConfig.SetOption "Protocol Name", strProtocol ' We opened a default session & changed the protocol, now we ' save the config to the new session path: objConfig.Save strSessionPath ' Now, let's open the new session configuration we've ' saved, and set up the various parameters that were specified ' in the file. If Not SessionExists(strSessionPath) Then crt.Dialog.MessageBox("Failed to create a new session '" & _ strSessionPath & "'." & vbcrlf & _ vbcrlf & _ "Does your configuration folder have " & _ "sufficient permissions to allow writing/creating " & _ "files?" & vbcrlf & vbcrlf & _ vbtab & _ "Options > Global Options > Configuration Paths" & _ vbcrlf & vbcrlf & _ "Fix permissions on your configuration folder and " & _ "then try running this script again.") Exit Sub End If Set objConfig = crt.OpenSessionConfiguration(strSessionPath) objConfig.SetOption "Emulation", strEmulation If LCase(strProtocol) <> "serial" Then If strHostName <> "" Then objConfig.SetOption "Hostname", strHostName End If If strUsername = "" Then strUsername = g_strDefaultUsername End If If strUserName <> "" Then objConfig.SetOption "Username", strUserName End If End If If strDescription <> "" Then objConfig.SetOption "Description", Split(strDescription, " ") End If If UCase(strProtocol) = "SSH2" Then If strPort = "" Then strPort = 22 objConfig.SetOption "[SSH2] Port", CLng(strPort) End If If UCase(strProtocol) = "SSH1" Then If strPort = "" Then strPort = 22 objConfig.SetOption "[SSH1] Port", CLng(strPort) End If If UCase(strProtocol) = "TELNET" Then If strPort = "" Then strPort = 23 objConfig.SetOption "Port", CLng(strPort) End If ' If you would like ANSI Color enabled for all imported sessions (regardless ' of value in Default session, remove comment from following line) ' objConfig.SetOption "ANSI Color", True ' Add other "SetOption" calls desired here... ' objConfig.SetOption "Auto Reconnect", True ' objConfig.SetOption "Color Scheme", "Traditional" ' objConfig.SetOption "Color Scheme Overrides Ansi Color", True ' objConfig.SetOption "Copy to clipboard as RTF and plain text", True ' objConfig.SetOption "Description", Array("This session was imported from a script on " & Now) ' objConfig.SetOption "Firewall Name", "YOUR CUSTOM FIREWALL NAME HERE" ' objConfig.SetOption "Line Send Delay", 15 ' objConfig.SetOption "Log Filename V2", "${VDS_USER_DATA_PATH}\_ScrtLog(%S)_%Y%M%D_%h%m%s.%t.txt" ' objConfig.SetOption "Rows", 60 ' objConfig.SetOption "Cols", 140 ' objConfig.SetOption "Start Tftp Server", True ' objConfig.SetOption "Use Word Delimiter Chars", True ' objConfig.SetOption "Word Delimiter Chars", " <>()+=$%!#*" ' objConfig.SetOption "X Position", 100 ' objConfig.SetOption "Y Position", 50 objConfig.Save If g_strSessionsCreated <> "" Then g_strSessionsCreated = g_strSessionsCreated & vbcrlf End If g_strSessionsCreated = g_strSessionsCreated & " " & strSessionPath g_nSessionsCreated = g_nSessionsCreated + 1 End If ' Reset all variables in preparation for reading in the next line of ' the hosts info file. strEmulation = "" strPort = "" strHostName = "" strFolder = "" strUserName = "" strSessionName = "" strDescription = "" nDescriptionLineCount = 0 End If Loop g_nDataLines = objDataFile.Line objDataFile.Close crt.Session.SetStatusText "" Dim strResults strResults = "Import operation completed in " & _ GetMinutesAndSeconds(Timer - nStartTime) If g_nSessionsCreated > 0 Then strResults = strResults & _ vbcrlf & _ String(70, "-") & vbcrlf & _ "Number of Sessions created: " & g_nSessionsCreated & vbcrlf & _ vbcrlf & _ g_strSessionsCreated Else strResults = strResults & vbcrlf & _ String(70, "-") & vbcrlf & _ "No sessions were created from " & g_nDataLines & " lines of data." End If If g_strErrors = "" Then strResults = "No errors/warnings encountered from the import operation." & vbcrlf & vbcrlf & strResults Else strResults = "Errors/warnings from this operation include: " & g_strErrors & vbcrlf & _ String(70, "-") & vbcrlf & _ strResults End If If g_strBogusLinesNotImported <> "" Then strResults = _ "The following lines from the data file were *not* imported for " & _ "various reasons detailed below:" & vbcrlf & _ String(70, "=") & vbcrlf & _ strFieldDesignations & _ g_strBogusLinesNotImported & vbcrlf & _ String(70, "-") & vbcrlf & _ "Fix the above lines to resolve the issue and save the fixed lines " & _ "to a new file. You can then run this script again to import these " & _ "skipped sessions." & vbcrlf & vbcrlf & strResults End If Set cFilenames = CreateObject("Scripting.Dictionary") cFilenames.Add Replace(g_strMyDocs & "/__SecureCRT-Session-ImportLog-" & g_strDateTimeTag & ".txt", "", "/"), "" cFilenames.Add Replace(g_strMyDesktop & "/__SecureCRT-Session-ImportLog-" & g_strDateTimeTag & ".txt", "", "/"), "" cFilenames.Add Replace(g_strConfigFolder & "/__SecureCRT-Session-ImportLog-" & g_strDateTimeTag & ".txt", "", "/"), "" bSuccess = False strResults = strResults & vbcrlf & vbcrlf & _ String(80, "-") & vbcrlf For Each strFilename In cFilenames.Keys(): On Error Resume Next Set objFile = g_fso.OpenTextFile(strFilename, ForWriting, True) strErr = Err.Description nError = Err.Number On Error Goto 0 If nError = 0 Then bSuccess = True Exit For Else crt.Session.SetStatusText("Unable to open results file.") strResults = strResults & vbcrlf & _ "Failed to write summary results to: " & strFilename End If If Not g_fso.FileExists(strFilename) Then bSuccess = False Else Exit For End If Next If Not bSuccess Then crt.Clipboard.Text = strResults crt.Dialog.MessageBox( _ "Attempted to write summary results to the file locations below, " & _ "but access was denied." & vbcrlf & vbtab & vbcrlf & vbtab & _ Join(cFilenames.Keys(), vbcrlf & vbtab) & vbcrlf & vbcrlf & _ "Results are in the clipboard. " & _ "Paste this data into your favorite app now to see what occurred.") Exit Sub End If objFile.WriteLine strResults objFile.Close ' Display the log file as an indication that the information has been ' imported. g_shell.Run chr(34) & strFilename & chr(34), 5, False End Sub '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' Helper Methods and Functions '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Function ValidateFieldDesignations(ByRef strFields) If Instr(strFieldDesignations, g_strDelimiter) = 0 Then Dim strErrorMsg, strDelimiterDisplay strErrorMsg = "Invalid header line in data file. " & _ "Delimiter character not found: " If Len(g_strDelimiter) > 1 Then strDelimiterDisplay = g_strDelimiter Else If Asc(g_strDelimiter) < 33 or Asc(g_strDelimiter) > 126 Then strDelimiterDisplay = "ASCII[" & Asc(g_strDelimiter) & "]" Else strDelimiterDisplay = g_strDelimiter End If End If strErrorMsg = strErrorMsg & strDelimiterDisplay & vbcrlf & vbcrlf & _ "The first line of the data file is a header line " & _ "that must include" & vbcrlf & _ "a '" & strDelimiterDisplay & _ "' separated list of field keywords." & vbcrlf & _ vbcrlf & "'hostname' is a required key word." & _ vbcrlf & vbcrlf & _ "The remainder of the lines in the file should follow the " & _ vbcrlf & _ "pattern established by the header line " & _ "(first line in the file)." & vbcrlf & "For example:" & vbcrlf & _ g_strExampleHostsFile MsgBox strErrorMsg, _ vbOkOnly, _ "Import Data To SecureCRT Sessions" Exit Function End If If Instr(LCase(strFieldDesignations), "hostname") = 0 Then strErrorMsg = "Invalid header line in data file. " & _ "'hostname' field is required." If Len(g_strDelimiter) > 1 Then strDelimiterDisplay = g_strDelimiter Else If Asc(g_strDelimiter) < 33 Or Asc(g_strDelimiter) > 126 Then strDelimiterDisplay = "ASCII[" & Asc(g_strDelimiter) & "]" Else strDelimiterDisplay = g_strDelimiter End If End If MsgBox strErrorMsg & vbcrlf & _ "The first line of the data file is a header line " & _ "that must include" & vbcrlf & _ "a '" & strDelimiterDisplay & _ "' separated list of field keywords." & vbcrlf & _ vbcrlf & "'hostname' is a required keyword." & _ vbcrlf & vbcrlf & _ "The remainder of the lines in the file should follow the " & _ vbcrlf & _ "pattern established by the header line " & _ "(first line in the file)." & vbcrlf & "For example:" & vbcrlf & _ g_strExampleHostsFile, _ vbOkOnly, _ "Import Data To SecureCRT Sessions" Exit Function End If If Instr(LCase(strFieldDesignations), "protocol") = 0 Then Set objConfig = crt.OpenSessionConfiguration("Default") g_strDefaultProtocol = objConfig.GetOption("Protocol Name") Else ' We found "protocol", now look for a default protocol designation vFields = Split(strFields,g_strDelimiter) For each strField In vFields If (InStr(LCase(strField), "protocol") > 0) And _ (Instr(LCase(strField), "=") >0) Then g_strDefaultProtocol = UCase(Split(strField, "=")(1)) ' Fix the protocol field since we know the default protocol ' value strFields = Replace(strFields, strField, "protocol") End If Next End If vFields = Split(strFields, g_strDelimiter) For Each strField In vFields If (Instr(LCase(strField), "folder") > 0) And _ (Instr(LCase(strField), "=") > 0) Then g_strDefaultFolder = Split(strField, "=")(1) ' Fix the folder field since we know the default folder strFields = Replace(strFields, strField, "folder") End If If (Instr(LCase(strField), "username") > 0) And _ (Instr(LCase(strField), "=") > 0) Then g_strDefaultUsername = Split(strField, "=")(1) ' Fix the username field since we know the default username strFields = Replace(strFields, strField, "username") End If Next ValidateFieldDesignations = True End Function '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Function ReadRegKey(strKeyPath) On Error Resume Next Err.Clear ReadRegKey = g_shell.RegRead(strKeyPath) If Err.Number <> 0 Then ' Registry key must not have existed. ' ReadRegKey will already be empty, but for the sake of clarity, we'll ' set it to an empty string explicitly. ReadRegKey = "" End If On Error Goto 0 End Function '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Function CreateFolderPath(strPath) ' Recursive function If g_fso.FolderExists(strPath) Then CreateFolderPath = True Exit Function End If ' Check to see if we've reached the drive root If Right(strPath, 2) = ":" Then CreateFolderPath = True Exit Function End If ' None of the other two cases were successful, so attempt to create the ' folder On Error Resume Next g_fso.CreateFolder strPath nError = Err.Number strErr = Err.Description On Error Goto 0 If nError <> 0 Then ' Error 76 = Path not found, meaning that the full path doesn't exist. ' Call ourselves recursively until all the parent folders have been ' created: If nError = 76 Then _ CreateFolderPath(g_fso.GetParentFolderName(strPath)) On Error Resume Next g_fso.CreateFolder strPath nError = Err.Number strErr = Err.Description On Error Goto 0 ' If the Error is not = 76, then we have to bail since we no longer have ' any hope of successfully creating each folder in the tree If nError <> 0 Then g_strLastError = strErr Exit Function End If End If CreateFolderPath = True End Function '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Function NN(nNumber, nDesiredDigits) ' Normalizes a number to have a number of zeros in front of it so that the ' total length of the number (displayed as a string) is nDesiredDigits. Dim nIndex, nOffbyDigits, strResult nOffbyDigits = nDesiredDigits - Len(nNumber) NN = nNumber If nOffByDigits = 0 Then Exit Function If nOffByDigits > 0 Then ' The number provided doesn't have enough digits strResult = String(nOffbyDigits, "0") & nNumber Else ' The number provided has too many digits. nOffByDigits = Abs(nOffByDigits) ' Only remove leading digits if they're all insignificant (0). If Left(nNumber, nOffByDigits) = String(nOffByDigits, "0") Then strResult = Mid(nNumber, nOffByDigits + 1) Else ' If leading digits beyond desired number length aren't 0, we'll ' return the number as originally passed in. strResult = nNumber End If End If NN = strResult End Function '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Function GetMinutesAndSeconds(nTotalSecondsElapsed) Dim nMinutesElapsed, nSecondsValue, nSecondsElapsed If nTotalSecondsElapsed = 0 Then GetMinutesAndSeconds = "less than a second." Exit Function End If ' Convert seconds into a fractional minutes value. nMinutesElapsed = nTotalSecondsElapsed / 60 ' Convert the decimal portion into the number of remaining seconds. nSecondsValue = nMinutesElapsed - Fix(nMinutesElapsed) nSecondsElapsed = Fix(nSecondsValue * 60) ' Remove the fraction portion of minutes value, keeping only the digits to ' the left of the decimal point. nMinutesElapsed = Fix(nMinutesElapsed) ' Calculate the number of milliseconds using the four most significant ' digits of only the decimal fraction portion of the number of seconds ' elapsed. nMSeconds = Fix(1000 * (nTotalSecondsElapsed - Fix(nTotalSecondsElapsed))) ' Form the final string to be returned and set it as the value of our ' function. GetMinutesAndSeconds = nMinutesElapsed & " minutes, " & _ nSecondsElapsed & " seconds, and " & _ nMSeconds & " ms" End Function '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Function SessionExists(strSessionPath) ' Returns True if a session specified as value for strSessionPath already ' exists within the SecureCRT configuration. ' Returns False otherwise. On Error Resume Next Set objTosserConfig = crt.OpenSessionConfiguration(strSessionPath) nError = Err.Number strErr = Err.Description On Error Goto 0 ' We only used this to detect an error indicating non-existance of session. ' Let's get rid of the reference now since we won't be using it: Set objTosserConfig = Nothing ' If there wasn't any error opening the session, then it's a 100% indication ' that the session named in strSessionPath already exists If nError = 0 Then SessionExists = True Else SessionExists = False End If End Function '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Function GetDateTimeTag() ' Use WMI to get at the current time values. This info will be used ' to avoid overwriting existing sessions by naming new sessions with ' the current (unique) timestamp. Set objWMIService = GetObject("winmgmts:\. ootcimv2") Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem") For Each objItem In colItems strLocalDateTime = objItem.LocalDateTime Exit For Next ' strLocalDateTime has the following pattern: ' 20111013093717.418000-360 [ That is, YYYYMMDDHHMMSS.MILLIS(zone) ] GetDateTimeTag = Left(strLocalDateTime, 18) End Function '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Function GetConfigPath(): Set objConfig = crt.OpenSessionConfiguration("Default") ' Try and get at where the configuration folder is located. To achieve ' this goal, we'll use one of SecureCRT's cross-platform path ' directives that means "THE path this instance of SecureCRT ' is using to load/save its configuration": ${VDS_CONFIG_PATH}. ' First, let's use a session setting that we know will do the ' translation between the cross-platform moniker ${VDS_CONFIG_PATH} ' and the actual value... say, "Upload Directory V2" strOptionName = "Upload Directory V2" ' Stash the original value, so we can restore it later... strOrigValue = objConfig.GetOption(strOptionName) ' Now set the value to our moniker... objConfig.SetOption strOptionName, "${VDS_CONFIG_PATH}" ' Make the change, so that the above templated name will get written ' to the config... objConfig.Save ' Now, load a fresh copy of the config, and pull the option... so ' that SecureCRT will convert from the template path value to the ' actual path value: Set objConfig = crt.OpenSessionConfiguration("Default") strConfigPath = objConfig.GetOption(strOptionName) ' Now, let's restore the setting to its original value objConfig.SetOption strOptionName, strOrigValue objConfig.Save ' Now return the config path GetConfigPath = strConfigPath End Function