自己写了个CRT脚本有点问题,希望各位帮我看看哈
securecrt吧
全部回复
仅看楼主
level 1
白_M 楼主
算是一个比较通用的脚本,可以自定义命令,自定义log保存位置,自定义IP列表
不过暂时只限cisco设备和telnet登录方式
代码在二楼
2016年04月27日 16点04分 1
level 1
白_M 楼主
#$language = "VBScript"
#$interface = "1.0"
crt.Screen.Synchronous = True
Const UserName1 = "", PassWord1 = ""
'设置第一套用户名和密码
Const UserName2 = "", PassWord2 = "", EnablePassWD2 = ""
'设置第二套用户名和密码以及enable密码
Const LstFileLK = "D:\Yone\Documents\Run\list1.txt"
'设置地址表位置
Const CmdFileLK = "D:\Yone\Documents\Run\cmd.txt"
'设置命令表位置
Const LogFileLK = "D:\Yone\Documents\Run\log\"
'设置回显保存的位置(此处只要设置保存到的文件夹位置,命令产生的回显会自动以IP.TXT保存在不同文件中)
Const Read = 1, Write = 2
'设置常量Read为1,Write为2
'以上为全局常量在整个程序中均有效
Sub Main
'主函数
Dim fso, LstFile
'定义两个变量(注:fso为局部变量仅在此函数中有效)
Set fso = CreateObject("Scripting.FileSystemObject")
'调用函数创建对象
Set LstFile = fso.OpenTextFile(LstFileLK, Read, False)
'调用函数创建对象的属性(读取地址表中的内容)
Login(LstFile)
'调用Login子函数,并将地址表中的内容传入
Crt.Screen.Synchronous = False
'Crt运行完毕
End Sub
'程序结束
Sub Login(LstFile)
'Login子函数(接收主函数传递的内容)
Dim IP,SwitchKey
Do While LstFile.AtEndOfStream <> True
'循环读入地址表中的内容直到结束
On Error Resume Next
IP = LstFile.ReadLine
'读入地址表中的第一行内容
Crt.Session.LogFileName = LogFileLK & IP & ".txt"
'创建回显保存的文件名(IP.TXT)
Crt.Session.Log(True)
Crt.Session.Connect "/TELNET " & IP
'使用TELNET方式登录
On Error Resume Next
SwitchKey = Crt.Screen.WaitForStrings("LDAP username: " , "Username: " , 1)
Select Case SwitchKey
Case 1
Crt.Screen.Send UserName1 & vbCr
'发送第一套用户名,并记录下回显到相应的文件中
Crt.Screen.WaitForString "LDAP password: "
'等待回显字符串为LDAP password:
Crt.Screen.Send PassWord1 & vbCr
'发送第一套密码,并记录下回显到相应的文件中
Case 2
Crt.Screen.Send UserName2 & vbCr
Crt.Screen.WaitForString "Password: "
Crt.Screen.Send PassWord2 & vbCr
Crt.Screen.WaitForString ">"
Crt.Screen.Send "enable" & vbCr
Crt.Screen.WaitForString "Password: "
Crt.Screen.Send EnablePassWD2 & vbCr
Case Else
'crt.Session.Disconnect
End Select
' If (Crt.Screen.WaitForString("LDAP username: ") <> False) Then
' '如果 登录后屏幕回显的字符串为LDAP username: 则运行
'
' Crt.Screen.Send UserName1 & vbCr
' '发送第一套用户名,并记录下回显到相应的文件中
' Crt.Screen.WaitForString "LDAP password: "
' '等待回显字符串为LDAP password:
' Crt.Screen.Send PassWord1 & vbCr
' '发送第一套密码,并记录下回显到相应的文件中
' End If
' 'If语句结束
'
' If (Crt.Screen.WaitForString ("Username: ") <> False) Then
'
' Crt.Screen.Send UserName2 & vbCr
' Crt.Screen.WaitForString "Password: "
' Crt.Screen.Send PassWord2 & vbCr
' Crt.Screen.WaitForString ">"
' Crt.Screen.Send "enable" & vbCr
' Crt.Screen.WaitForString "Password: "
' Crt.Screen.Send EnablePassWD2 & vbCr
'
' End If
RunCommand()
'调用RunCommand子函数
Loop
'循环结束
End Sub
'返回主函数
Sub RunCommand()
'RunCommand子函数
Dim fso, CmdFile, CMD
'此处fso变量属于局部变量,所以不会和主函数中的fso变量冲突
Set fso = CreateObject("Scripting.FileSystemObject")
'创建对象
Set CmdFile = fso.OpenTextFile(CmdFileLK, Read, False)
'读取命令表中的命令
Do
crt.Screen.Send chr(13)
Loop Until (crt.Screen.WaitForString("#") <> False)
Do While CmdFile.AtEndOfStream <> True
'循环执行命令表中的命令直到结束
On Error Resume Next
CMD = CmdFile.ReadLine
crt.Screen.Send CMD & vbcr
'执行命令表中的命令
Do while ( crt.Screen.WaitForString(" --More-- ") <> False )
crt.Screen.Send(" ")
Loop
Loop
'循环结束
crt.Session.Disconnect
'关闭CRT对话框
End Sub
'返回Login子函数
2016年04月27日 16点04分 2
level 1
白_M 楼主
在Sub RunCommand()函数中
Do while ( crt.Screen.WaitForString(" --More-- ") <> False )
crt.Screen.Send(" ")
Loop
这里总是有问题
2016年04月27日 16点04分 4
level 1
白_M 楼主
意思是,比如sh run 的时候会有很多行,需要按空格键然它显示完,所以用一个循环来跑空格键,如果显示的不是--More--则跳出循环
2016年04月27日 16点04分 5
level 1
白_M 楼主
2016年04月27日 16点04分 6
具体什么问题?
2016年04月28日 01点04分
level 11
你在waitforstring里面加个等待时间。有时候吐log太快了securecrt 反应不过来。
2016年04月28日 01点04分 7
level 1
白_M 楼主
Do While CmdFile.AtEndOfStream <> True
'循环执行命令表中的命令直到结束
CMD = CmdFile.ReadLine
crt.Screen.Send CMD & vbcr
'执行命令表中的命令
Do While (crt.Screen.WaitForString(" --More-- ",2) = True)
crt.Screen.Send(" ")
Loop 'Until (crt.Screen.WaitForString ( "--More--" ) <> True)
' CMD = CmdFile.ReadLine
' crt.Screen.Send CMD & vbcr
'执行命令表中的命令
Loop
@乱世的小雄 谢谢[乖]
解决了,加了2秒等待,之前每次跑完空格就卡住了[喷]
原来CRT还有反应慢的时候[喷]
2016年04月28日 02点04分 8
level 11
它毕竟是客户端,不是在服务器上跑的脚本。有延时很正常。
2016年04月28日 04点04分 9
level 1
你好,看了你的脚本 ,感觉很全面,但是也好复杂 ;我用别的脚本只需要把批量操作的设备的IP地址 用户名 密码 EN 都逐行编辑好再一个表里,再设置一个文件夹用来保存记录的日志文件, 你这里还有个 命令表 ,这个是怎么操作的?
2016年05月13日 09点05分 10
level 1
怎么把两个show写一起呢
比如先show run,循环空格,显示完之后继续show ver
楼主尝试过吗?
2018年07月25日 01点07分 11
level 1
#$language = "VBScript"
#$interface = "1.0"
Sub Main
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim fso,file1,line,str1,params
Set fso = CreateObject("Scripting.FileSystemObject")
Set file1 = fso.OpenTextFile("d:\SWbackup\config.txt",Forreading,False)
crt.Screen.Synchronous = True
DO While file1.AtEndOfStream <> True
line = file1.ReadLine
params = Split (line)
crt.session.LogFileName = "d:\SWbackup\log\20210407\" & params(0) & ".txt"
crt.session.Log(true)
crt.Session.Connect "/TELNET " & params(0)
crt.Screen.WaitForString "Password:"
crt.Screen.Send params(1) & vbcr
crt.Screen.Send "enable" & vbcr
crt.Screen.WaitForString "Password:"
crt.Screen.Send params(2) & vbcr
crt.Screen.WaitForString "#"
crt.Screen.Send "write" & vbcr
str1 = "show run"
crt.Screen.Send str1 & vbcr
crt.Screen.WaitForString " --More-- "
crt.Screen.Send " " & vbcr
'
crt.Screen.Send "reload" & vbcr
crt.Screen.WaitForString "Reload system?(Y/N)"
crt.Screen.Send "y" & vbcr
crt.Screen.waitForString "!" & vbcrlf & "end"
crt.Session.Disconnect
loop
crt.Screen.Synchronous = False
End Sub
2021年04月07日 13点04分 13
各位大佬 帮忙看下我这个脚本呗
2021年04月07日 13点04分
实现保存配置并且重启 但是执行的时候提示下标越界错误[泪]
2021年04月07日 13点04分
1