




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SecureCRT脚本编写方法一、 SecureCRT工具常用到的几个函数阐述如下:在SecureCRT里,用得最多的应该就是crt.Screen,基本上很多操作都是基于屏幕的返回字来决定下一步该作何操作:第一:crt.Screen.WaitForString(KeyString,timewaiting)该函数是单字符串判断,KeyString是需要查找的关键字,timewaiting是一个超时阀值,例如:crt.Screen.WaitForString(people:,5)该行代码的意思就是在5秒内没有检测到people:出现,就执行下一条语句,如果改成:crt.Screen.WaitForString(people:)那就是指直到people:出现才执行下一行代码 WaitForString是有返回值的,返回值是True或者False 因此,可以根据返回值进行条件判断以确定一下条代码 例如:If(crt.Screen.WaitForString(currentstate:UP,1)False)ThenportStatus=PortUPElseportStatus=PortDownEndIfmsgboxportStatus这段代码用于判断端口状态情况并记录下来.第二:crt.Screen.WaitForStrings(KeyString1,KeyString2,.,timeout)用于多个字符串的判断,timeout的作用是一样的 例如:crt.Screen.WaitForStrings(cisco,huawei,H3C,5)意思就是在5秒内有检测到相应的字符时,返回相应的索引号(索引号是从1开始的) 如果都没有检查到,则返回0.因此,该函数的使用可以如下:Dim SwitchKeySwitchKey=crt.Screen.WaitForStrings(cisco,huawei,H3C,5)Select case SwitchKeycase 1MsgBox思科设备case 2MsgBox华为设备case 3MsgBox华三设备case elseMsgBox未知设备End Select几个对话性的函数其实SecureCRT支持的脚本语言就是VBS,这个脚本语言与VB有较大的不同,对于界面的支持性较差 不过也有几个对话性的函数1、InputBox:提示用户输入参数temp=inputbox(提示用户你输入参数的名称,对话框的名称):需要将输入的参数赋值给某一个参数进行使用 2、输出函数msgboxmsgbox“给用户输出的信息对话框”eg.求正方形面积的脚本dimr,sr=inputbox(请输入正方形的边长:,求正方形面积的程序)s=r*rmsgbox(s)巡检代码示例下面就我的工作性质,跟我同事一块制作的一个脚本程序维护着N台路由器设备,每天需要对这些设备进行例行巡检 下面是程序的所有代码,希望对各位有所帮助*#$language=VBScript#$interface=1.0说明:本代码可在CRT工具中实现Cosico,华为,爱立信路由器交换机数据的自动配置或作为设备巡检之用;Setscreen=crt.Screen创建屏幕对象定义全局变量:Device变量为操作设备对象数组,作为存储设备名用;CiscoAggreOfCommands变量为思科设备命令集合数组,作为存储思科设备命令用;NE40EAggreOfCommands变量为华为NE40E设备命令集数组,作为存储华为NE设备命令用;SE800AggreOfCommands变量为爱立信SE800设备命令集数组,作为存储爱立信SE800设备命令用;ArrreOfRiskCommands变量为各厂家设备存在风险性操作命令的数组,作为存储过滤风险操作命令之用;DeviceNumth变量为Device数组序号;CommandNumth变量为各厂家命令数组的序号;ResultOfType变量为判断设备类型标识符;TypeOfCommand变量作为存储当前命令类型用;DimDevice,CiscoAggreOfCommands,NE40EAggreOfCommands,SE800AggreOfCommands,ArrreOfRiskCommandsDimDeviceNumth,CommandNumth,ResultOfTypeDimTypeOfCommand爱立信设备集合Device=Array(CE35-ERICSE800,CE36-ERICSE800,CE37-ERICSE800,CE38-ERICSE800)华为设备集合Device=Array(CE07-HWNE40E,CE08-HWNE40E,_CE09-HWNE40E,CE10-HWNE40E,_CE11-HWNE40E,CE12-HWNE40E,_CE21-HWNE40E,CE22-HWNE40E,_CE23-HWNE40E,CE24-HWNE40E,_CE25-HWNE40E,CE26-HWNE40E,_CE29-HWNE40E,CE30-HWNE40E,_CE33-HWNE40E,CE34-HWNE40E,_CE45-HWNE40E,CE46-HWNE40E,_CE47-HWNE40E,CE48-HWNE40E,_CE49-HWNE40E,CE50-HWNE40E)思科设备命令集合CiscoAggreOfCommands=Array(showcdp,_showconf,_showhard,_showinterface,_showiproute,_showconf)华为NE40E设备命令集合健康检查告警检查日志检查单板运行状态检查CPU占用率检查内存占用率检查接口和链路状态以及流量检查NE40E接口状态检查OSPF邻居状态检查路由信息检查NE40EAggreOfCommands=Array(displayhealth,_displaytrapbuffer,_displaylogbuffer,_displaydevice,_displaycpu-usage,_displaymemory-usage,_displayinterface,_disospfpeer,_displayiprouting-table)爱立信SE800设备命令集合单板注册信息办卡加电自检单板运行状态检查检查背板运行状态检查主控板冗余性存储设备利用率CPU利用率内存利用率检查端口运行状态检查端口数据收发状态检查电源使用情况检查检查OSPF状态SE800AggreOfCommands=Array(showchassis,_showdiagon-demanddetail,_showhardware,_showbackplane-status,_showredundancy,_showdisk,_showprocess,_showmemory,_showportdetail,_showportcountersdetail,_showchassispower,_contextChinaMobile_NGN_SG,_showospfneighbor,_contextChinaMobile_NGN_Media,_showospfneighbor)风险命令过滤集合ArreOfRiskCommands=Array(reb,rel)CE汇聚网管平台登陆子函数FunctionLandIPNETscreen.Send&chr(13)screen.WaitForStringogin:screen.SendXXXXXXXXXX&chr(13)screen.WaitForStringPassword:screen.SendXXXXXXXXXX&chr(13)EndFunction各厂家设备选择登陆子函数FunctionLandDevicescreen.Send&chr(13)screen.WaitForStringConsole>>screen.Sendopen&Device(DeviceNumth)ResultOfType=screen.WaitForStrings(Cisco,NE40E,SE800,4)IfResultOfType=1ThenTypeOfCommand=CiscoAggreOfCommandsCommandNumth=0ElseIfResultOfType=2ThenTypeOfCommand=NE40EAggreOfCommandsCommandNumth=0ElseIfResultOfType=3ThenTypeOfCommand=SE800AggreOfCommandsCommandNumth=0ElseMsgBoxErrorTypeOfDeviceDoLoopEndIfscreen.Send&chr(13)screen.WaitForStringsUsername:,ogin:screen.sendXXXXXXXXXX&chr(13)screen.WaitForStringPassword:screen.SendXXXXXXXXXX&chr(13)DoLoopUntil(screen.WaitForStrings(NE40E>,SE800#,5)False)EndFunction退出设备子函数FunctionExitDeviceIfResultOfType=1ThenElseIfResultOfType=2Thenscreen.Send&quit&chr(13)Doscreen.Send&chr(13)LoopUntil(screen.WaitForString(Console>>,1)False)ElseIfResultOfType=3Thenscreen.Send&exit&chr(13)Doscreen.Send&chr(13)LoopUntil(screen.WaitForString(Console>>,1)False)ElseEndIfEndFunctionFunctionShowAllDowhile(screen.WaitForStrings(More,more,3)False)crt.Screen.SendLoopEndFunction风险命令过滤子函数FunctionRiskCommandsDimresultresult=screen.WaitForStrings(ArreOfRiskCommands,1)IfresultFalseThenMsgBoxThecommandyouareimportingexistsrisk!DoLoopEndIfEndFunctionSubMaincrt.Screen.Synchronous=TrueLandIPNETForDeviceNumth=LBound(Device)ToUBound(Device)LandDeviceCommandNumth=0ForCommandNumth=LBound(TypeOfCommand)ToUBound(TypeOfCommand)screen.Send&TypeOfCommand(CommandNumth)RiskCommandsscreen.Send&chr(13)ShowAllIfscreen.WaitForString(More,1)FalseThenShowAllcrt.Sleep4000screen.Send&chr(13)NextExitDeviceNextcrt.Screen.Synchronous=FalseEndSub二、 自动化脚本编写三段模式模板从一个文件(目录为C:UserslilfDesktopip.txt)里面自动读取设备IP地址,密码等,自动登录设备进入特权模式 第一种情况:用户名+密码+特权密码方式# $language = “VBScript”# $interface = “1.0Sub Main打开保存设备管理地址以及密码的文件Const ForReading = 1, ForWriting = 2, ForAppending = 8Dim fso,file1,line,paramsSet fso = CreateObject(“Scripting.FileSystemObject”)Set file1 = fso.OpenTextFile(“C:UserslilfDesktopip.txt”,Forreading, False)crt.Screen.Synchronous = TrueDO While file1.AtEndOfStream True读出每行line = file1.ReadLine分离每行的参数 IP地址 用户名 密码 特权密码params = Split (line)Telnet到这个设备上crt.Session.Connect (“/TELNET ” & params(0)输入telnet用户名和密码crt.Screen.WaitForString “sername:”crt.Screen.Send params(1) & vbcrcrt.Screen.WaitForString “assword:”crt.Screen.Send params(2) & vbcr进特权模式crt.Screen.Send “enable” & vbcr输入特权密码crt.Screen.WaitForString “assword:”crt.Screen.Send params(3) & vbcrcrt.Screen.waitForString “#”ip.txt里相对应的IP地址、用户名、密码、特权密码,分别如下: admin ruijie ruijie admin ruijie ruijie admin ruijie ruijie第二种情况:密码+特权密码方式# $language = “VBScript”# $interface = “1.0Sub Main打开保存设备管理地址以及密码的文件Const ForReading = 1, ForWriting = 2, ForAppending = 8Dim fso,file1,line,paramsSet fso = CreateObject(“Scripting.FileSystemObject”)Set file1 = fso.OpenTextFile(“C:UserslilfDesktopip.txt”,Forreading, False)crt.Screen.Synchronous = TrueDO While file1.AtEndOfStream True读出每行line = file1.ReadLine分离每行的参数 IP地址 密码 特权密码params = Split (line)Telnet到这个设备上crt.Session.Connect (“/TELNET ” & params(0)输入telnet密码crt.Screen.WaitForString “assword:”crt.Screen.Send params(1) & vbcr进特权模式crt.Screen.Send “enable” & vbcr输入特权密码crt.Screen.WaitForString “assword:”crt.Screen.Send params(2) & vbcrcrt.Screen.waitForString “#”ip.txt里相对应的IP地址、密码、特权密码,分别如下: admin ruijie admin ruijie admin ruijie脚本发送命令:crt.Screen.Send”要发送的命令” & chr(13) /这个是回车,并且每行只发送一个命令 如下,进入全局模式下,去掉OSPF进程号800crt.Screen.Send “conf t” & chr(13)crt.Screen.WaitForString “(config)#”crt.Screen.Send “no router ospf 800 & chr(13)crt.Screen.WaitForString “(config)#”crt.Screen.Send “end” & chr(13)crt.Screen.WaitForString “#”crt.Screen.Send “wr” & chr(13)J 这样去写是相当困难的,所以我们可以用先录制好需要进行相关操作的脚本,打开那个录制好的,复制那些相关的命令 这样不用自己逐条手写了 完成一台设备的操作之后,退出并进入下一台设备 完成后退出crt.Screen.waitForString “#”,3 /等待3S后如果没有其它操作,则自动断开crt.Session.Disconnectloopcrt.Screen.Synchronous = FalseEnd Sub三、 应用案例真实场景:客户升级,客户有145台设备需要升级,其中有rgos.bin,也有少部分的rgnos.bin 首先查找当前运行的是rgos.bin还是rgnos.bin运行脚本,并记录日志到一个文本中,按2.1.2图即可脚本如下:# $language = “VBScript”# $interface = “1.0Sub MainConst ForReading = 1, ForWriting = 2, ForAppending = 8Dim fso,file1,line,paramsSet fso = CreateObject(“Scripting.FileSystemObject”)Set file1 = fso.OpenTextFile(“C:UserslilfDesktopip.txt “,Forreading, False)crt.Screen.Synchronous = TrueDO While file1.AtEndOfStream Trueline = file1.ReadLineparams = Split (line)crt.Session.Connect “/TELNET ” & params(0)crt.Screen.WaitForString “sername:”crt.Screen.Send params(1) & vbcrcrt.Screen.WaitForString “assword:”crt.Screen.Send params(2) & vbcrcrt.Screen.Send “enable” & vbcrcrt.Screen.waitForString “#”crt.Screen.Send “show ver” & vbcrcrt.Screen.WaitForString “#”crt.Screen.Send vbcrcrt.Screen.waitForString “#”,3crt.Session.Disconnectloopcrt.Screen.Synchronous = FalseEnd SubC:UserslilfDesktopip.txt中的内容如下 XXXX XXXX0 XXXX XXXX完成show ver后,查看日记记录,找到当前运行的是rgnos.bin设备,并把他的IP地址从ip.txt中去掉,新建ip1.txt 升级rgos.bin:# $language = “VBScript”# $interface = “1.0Sub MainConst ForReading = 1, ForWriting = 2, ForAppending = 8Dim fso,file1,line,paramsSet fso = CreateObject(“Scripting.FileSystemObject”)Set file1 = fso.OpenTextFile(“C:UserslilfDesktopip.txt “,Forreading, False)crt.Screen.Synchronous = TrueDO While file1.AtEndOfStream Trueline = file1.ReadLineparams = Split (line)crt.Session.Connect “/TELNET ” & params(0)crt.Screen.WaitForString “sername:”crt.Screen.Send params(1) & vbcrcrt.Screen.WaitForString “assword:”crt.Screen.Send params(2) & vbcrcrt.Screen.Send “enable” & vbcrcrt.Screen.waitForString “#”crt.Screen.Send “copy t3/R2700_94674_install.bin flash:rgos.bin” & vbcrcrt.Screen.WaitForString “UPGRADING OK.”crt.Screen.WaitForString “#”crt.Screen.Send vbcrcrt.Screen.waitForString “#”,3crt.Session.Disconnectloopcrt.Screen.Synchronous = FalseEnd Subrgnos.bin的升级方法也是同样的 在合适的时间重启:# $language = “VBScript”# $interface = “1.0Sub MainConst ForReading = 1, ForWriting = 2, ForAppending = 8Dim fso,file1,line,paramsSet fso = CreateObject(“Scripting.FileSystemObject”)Set file1 = fso.OpenTextFile(“C:UserslilfDesktopip.txt “,Forreading, False)crt.Screen.Synchronous = TrueDO While file1.AtEndOfStream Trueline = file1.ReadLineparams = Split (line)crt.Session.Connect “/TELNET ” & params(0)crt.Screen.WaitForString “sername:”crt.Screen.Send params(1) & vbcrcrt.Screen.WaitForString “assword:”crt.Screen.Send params(2) & vbcrcrt.Screen.Send “enable” & vbcrcrt.Screen.waitForString “#”crt.Screen.Send “reload in 1 & vbcrcrt.Screen.WaitForString “#”crt.Screen.Send vbcrcrt.Screen.waitForString “#”,3crt.Session.Disconnectloopcrt.Screen.Synchronous = FalseEnd Sub重启过程中用批量ping工具监视,重启完成后查看是否都正常 说明注意事项:如果运行过程中telnet到一台不可达的设备后,则脚本会中断,刚需要人工去再次运行,故运行之前先用批量ping工具测试设备连通性 自动登录脚本下面是我根据上面的文档编写的没有用户名的自动登录# $language = VBScript# $interface = 1.0Sub Main打开保存设备管理地址以及密码的文件Const ForReading = 1, ForWriting = 2, ForAppending = 8Dim fso,file1,line,paramsSet fso = CreateObject(Scripting.FileSystemObject)Set file1 = fso.OpenTextFile(C:ip.txt,Forreading, False)crt.Screen.Synchronous = TrueDO While file1.AtEndOfStream True读出每行line = file1.ReadLine分离每行的参数 IP地址 密码 特权密码params = Split (line)Telnet到这个设备上crt.Session.Connect (/TELNET & params(0)输入telnet用户名和密码crt.Screen.WaitForString assword:crt.Screen.Send cisco & vbcr进特权模式crt.Screen.Send enable & vbcr输入特权密码crt.Screen.WaitForString assword:crt.Screen.send cisco & vbcrcrt.Screen.waitForString #crt.Screen.Send show ver & vbcrcrt.Screen.waitForString #crt.Screen.Send clear counters & vbcr & vbcrcrt.Screen.waitForString # ,300crt.Session.Disconnectloopcrt.Screen.Synchronous = FalseEnd Sub四、 其他示例【示例一】简单自动登录# $language = VBScript# $interface = 1.0本脚本示范:自动登录到某台3550交换机设备,自动输入远程登录密码,同时自动进入特权模式自动输入特权密码,同时运行show version命令Sub Maincrt.Screen.Synchronous = True通过telnet连接到crt.Session.Connect /TELNET crt.Screen.WaitForString Password:crt.Screen.Send cisco & vbCrcrt.Screen.waitForStringcrt.Screen.Send enable & vbcrcrt.Screen.WaitForString Password:crt.Screen.Send cisco & vbcrcrt.Screen.waitForString #crt.Screen.Send show version & vbcrcrt.Screen.waitForString -More-crt.Screen.Send crt.Screen.Synchronous = FalseEnd Sub【示例二】自动备份配置# $language = VBScript# $interface = 1.0本脚本示范:从一个文件里面自动读取设备IP地址,密码等,自动将设备配置备份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:config.txt,Forreading, False) crt.Screen.Synchronous = True DO While file1.AtEndOfStream True 读出每行 line = file1.ReadLine 分离每行的参数 IP地址 密码 En密码 params = Split (line) Telnet到这个设备上 crt.Session.Connect /TELNET & params(0) 输入telnet密码 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 # 备份目前Startup配置 str1 = copy startup t/ str1 = str1 & backup( & params(0) &) & .cfg crt.Screen.Send str1 & vbcr crt.Screen.WaitForString ? crt.Screen.Send vbcr crt.Screen.WaitForString ? crt.Screen.Send vbcr 备份完成后退出 crt.Screen.waitForString #,3 crt.Session.Disconnect loop crt.Screen.Synchronous = False End Subconfig.txt文本文件为事先编辑好的格式如: cisco cisco54 cisco cisco前面是IP地址,后面是telnet密码,最后是enable密码【示例三】多会话操作VBScript# $language = “VBScript”# $interface = “1.0Sub Main() crt.screen.Synchronous = true Dim Name Dim NametreDim nTabCount nTabCount = crt.GetTabCount()for index = 1 to nTabCountset tab = crt.GetTab(index)tab.activate If tab.Session.Connected = True Then这里以上都没有什么可以说的,之前的文章已经介绍的很多很多了,如果有不清楚的朋友可以看本文上提供的该系列脚本的其它部分的文章链接从这里往下就是最最核心的部分的了:)获取激活会话的名称 Name =tab.Caption开始做匹配,并根据匹配的结果输入相应命令 Select Case Nametre Case “你的会话的名称1等待1秒钟 crt.sleep 1000 tab.Screen.Send “在名称1的会话中你要输入的命令1 & chr(13)等待1秒钟 crt.sleep 1000 tab.Screen.Send “在名称1的会话中你要输入的命令2 & chr(13) crt.sleep 1000. Case “你的会话的名称2 等待1秒钟 crt.sleep 1000 tab.Screen.Send “在名称2的会话中你要输入的命令1 & chr(13)等待1秒钟 crt.sleep 1000 tab.Screen.Send “在名称2的会话中你要输入的命令2 & chr(13) crt.sleep 1000. Case “你的会话的名称3等待1秒钟 crt.sleep 1000 tab.Screen.Send “在名称3的会话中你要输入的命令1 & chr(13)等待1秒钟 crt.sleep 1000 tab.Screen.Send “在名称3的会话中你要输入的命令2 & chr(13) crt.sleep 1000. 其它情况输出 ”the name of this session is wrong!” Case Else MsgBox “the name of this session is wrong!” End SelectElse MsgBox “this session is not connected,can not input any command!” End IfNext End Sub【示例四】多会话操作2以下可以实现在已经打开的绘画窗口中,按照打开顺序输入固定的命令,即第一个窗口输入*,然后激活第二个窗口输入*,多窗口的命令输入是解决了,但是在实际的工作中发现,这样的一个脚本存在不少的缺陷:第一,会话窗口需要按照顺序手动打开,且要按照一定的顺序打开;第二,打开的顺序一旦有错,命令就会输入错误,命令输入没有自适应性;第三,会话的打开是要输入相应的命令,可是命令的结果仍然需要手动保存 【示例五】设备log保存这个脚本主要是用来将我们在第一步中打开的会话用log保存在一个我们设定的路径上,这样就可以将后续输入命令的结果自动保存在本地,方便后续的查看对比等工作,下面就让我们来看看这个“打开各个板卡log脚本”的具体的编写情况:# $language = “VBScript”# $interface = “1.0Sub Main() crt.screen.Synchronous = true定义两个变量 Dim Name Dim nCurrentTabnTabCount赋值为打开的会话的总个数 nTabCount = crt.GetTabCount()做循环 for index = 1 to nTabCount激活第index个会话 set tab = crt.GetTab(index) tab.activate 判断log的情况并获取会话的名称log到路径“D:新建文件夹”中,并命名为“会话名称.log”If tab.Session.Connected = True Then If tab.Session.Logging = False ThenName = tab.Captiontab.Session.LogFileName = “D:新建文件夹”&Name&”.log”tab.Session.Log True ElseIf tab.Session.Logging = True Thentab.Session.Log FalseName = tab.Captiontab.Session.LogFileName = “D:新建文件夹”&Name&”.log”tab.Session.Log True Else MsgBox “something unknown is wrong!”End IfElse MsgBox “this session is not connected,no need to be logged!”End IfNext End Sub【示例六】批量关闭log# $language = “VBScript”# $interface = “1.0脚本开始Sub Main() 从左到右激活每一个已经连接上的会话,并输入相关命令 第一个连接的会话 Set objCurrentTab1 = crt.GetTab(1) objCurrentTab1.Activate If objCurrentTab1.Session.Connected = True then objCurrentTab1.Screen.Send “相关命令1 & chr(13) objCurrentTab1.Screen.WaitForStr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 传染病防治监督技能竞赛模拟试卷及答案
- 2025年盘锦市政务服务中心(综合窗口)人员招聘笔试备考试题及答案
- 2025年中医外科病例分析演习答案及解析
- 2025年绍兴市政务服务中心(综合窗口)人员招聘笔试备考试题及答案
- 2025年近视试题及答案解析
- 2025年肾脏医学疾病肾功能评估技术考核答案及解析
- 2025年肿瘤内科病例分析与处理模拟试题答案及解析
- 外协安全培训学时课件
- 2025年科学思维训练题库及答案
- 2025年急救护理技能应急处置模拟考试答案及解析
- 心房颤动患者心脏康复中国专家共识
- 嵌入式软件架构的模块化设计研究
- 海绵城市施工方案
- 智能计算系统:从深度学习到大模型 第2版课件 第四章-编程框架使用
- 供应链管理师二级练习卷含答案
- 《公路边坡网锚喷植被混凝土生态防护技术指南》
- 主要负责人安全生产责任制模版(三篇)
- 2023部编新人教版五年级(上册)道德与法治全册教案
- 竞选竞选大学心理委员参考课件
- 2024年数控车工技能竞赛理论考试题库500题(含答案)
- 2024年秋季新统编版七年级上册道德与法治全册教案
评论
0/150
提交评论