secueCRT脚本再试牛刀
主机调整了登录流程,原本脚本跑不通了,今天针对新流程进行优化,有了新的心得。
1、crt.Screen.WaitForString 与crt.Screen.Get 的配合问题:crt.Screen.Get读取的是"屏幕缓冲区"的当前快照,而 SecureCRT 在收到远程数据后需要时间渲染到屏幕缓冲区。 Synchronous = True 只保证了脚本操作不被打断,但不保证屏幕缓冲区已经刷新,由于终端本身的回显渲染有延迟,而WaitForString只是等待数据流中出现该字符串,所以可能会出现等待到的字符串是上一个页面存在的内容,所以使用WaitForString,最好是等待目标页面独有的字符串,避免与旧页面内容混淆。或者使用Sleep来等待足够久的时间,再读取屏幕缓冲区来判断到了哪一页。
#$language = "VBScript" #$interface = "1.0" Sub Main crt.Screen.Synchronous = True If crt.Arguments.Count < 1 Then crt.Dialog.MessageBox "[ERROR] Need at least 1 arg (IP)" crt.Screen.Synchronous = False Exit Sub End If crt.Sleep 1000 crt.Screen.Send "/" & crt.Arguments(0) & vbcr If crt.Arguments.Count < 2 Then crt.Screen.Synchronous = False Exit Sub End If crt.Screen.WaitForString "[ r ]" totalRows = crt.Screen.Rows totalCols = crt.Screen.Columns screenText = "" For i = 1 To totalRows lineText = crt.Screen.Get(i, 1, i, totalCols) lineText = RTrim(lineText) If lineText <> "" Then If InStr(lineText, "[ ") > 0 Then If InStr(lineText, crt.Arguments(1)) > 0 Then start = InStr(lineText, "[") endPos = InStr(start + 1, lineText, "]") bracketContent = Mid(lineText, start + 1, endPos - start - 1) crt.Screen.Send bracketContent & vbcr Exit For End If End If End If Next If crt.Arguments.Count < 3 Then crt.Screen.Synchronous = False Exit Sub End If crt.Screen.WaitForString "Password: " crt.Screen.Send crt.Arguments(2) & vbcr If crt.Arguments.Count < 4 Then crt.Screen.Synchronous = False Exit Sub End If crt.Sleep 500 crt.Screen.WaitForString "$" 'crt.Screen.Send crt.Arguments(3) & " " & crt.Arguments(4) & vbcr crt.Screen.Send crt.Arguments(3) & vbcr crt.Screen.Synchronous = False End Sub
浙公网安备 33010602011771号