ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

SecureCRT自动化脚本实战:从SSH重复操作到批量巡检提效

2026/10/3 11:04:59 拓冰建站 浏览量
SecureCRT自动化脚本实战:从SSH重复操作到批量巡检提效 如果2025年你还在用SecureCRT那大概率不是因为它长得好看而是因为你每天都在跟交换机、路由器、跳板机、Linux服务器的SSH窗口打交道——重复敲命令敲到条件反射。SecureCRT自动化脚本开发这件事网上的教程大多停在“能跑就行”的阶段真正把登录等待、回显匹配、批量下发、日志落盘、超时处理这些生产环境必须考虑的细节讲清楚的很少。这篇实战版总结是我在现网环境整理出来的模板和避坑记录适合三类人天天重复登录设备执行同一串命令的运维、需要批量巡检上百台设备的网络工程师、以及想给团队做个提效工具但不想引入重型框架的后端同学。核心就一句话用SecureCRT自带的脚本框架把SSH会话做成可复用工具。1. 把重复SSH操作变成脚本先想清楚哪些活值得自动化1.1 我日常环境里真正省时间的三个场景先泼一盆冷水SecureCRT脚本不是万能药不值得把所有操作都塞进去。我自己观察下来真正值得自动化的场景就三类。第一类登录后的固定初始化动作。很多生产网络的跳板机登录之后需要加载环境变量、切换目录、确认当前维护窗口、记录登录时间。这些步骤完全固定人工敲很容易漏而漏一步后面所有命令都会跟着出错。脚本最擅长处理这种“固定顺序、固定按钮”的流程。第二类批量巡检和收集回显。比如每天要登10台路由器执行show version、show clock、show ip interface brief把结果保存本地。这种活重复度极高又是老设备、慢回显人工一边等一边担心漏命令脚本跑完还能自动给结果文件命名输出直接落到固定目录。第三类日志归档。大家经常搜“SecureCRT怎么把日志保存成文件”确实手点菜单可以保存但点多了就烦。脚本里通过crt.Session.LogFileName指定路径、crt.Session.Log(True)打开日志两行代码解决配合时间戳命名日志再也不会挤成一个“未命名.txt”。1.2 VBScript、JavaScript还是Python怎么选SecureCRT从很多年前就内置了一套脚本对象模型支持的语言有三种VBScript、JavaScript、Python。性能上说实话区别不大真正影响选择的因素是代码维护习惯和运行环境。语言上手成本运行环境适合场景VBScript低语法简单所有SecureCRT版本默认支持小型自动化、登录增强、简单等待匹配JavaScript中老版本就开始支持兼容性好逻辑稍复杂但不想引入Python的存量脚本Python中看自己写代码熟练度新版SecureCRT才内置版本较新的9.x比较好批量巡检、文件操作、正则处理回显我的建议很实际如果你只是给某几台设备写登录后自动执行命令用VBScript就够了。网上存量示例最多、抄起来最快、十年老脚本今天照样跑。如果你要写一个巡检系统要拼接批量任务、清洗回显文本、写CSV报表选Python。SecureCRT 9.x对Python脚本的支持已经比较完善crt对象在Python里照常可用文本处理能力和文件操作比VBScript舒服太多。1.3 脚本边界什么不建议做成SecureCRT脚本有几类活别硬塞给SecurCRT脚本。第一是完全不可预测的动态交互。比如设备回显出现异常告警时需要人根据内容判断继续还是中止再比如某些二次认证需要外部手机扫码这种交互天然不适合脚本。第二是高权限凭证落地。脚本里明文写root密码、enable密码时间一长谁也说不清密码会流到哪些人手里。这个问题我在第4章会讲具体替代方案——用弹窗临时输入脚本只做转发。第三是一次性临时命令。像“帮我看一下现在这台设备跑了什么进程”直接手动敲更快。为一次性的操作写脚本等于花五分钟省十秒钟不值。2. 运行脚本的三条路径菜单、按钮栏和命令行参数2.1 菜单运行从临时调试到快速验证SecureCRT运行脚本最直观的方式是菜单栏的Script - Run。点击之后选择脚本文件脚本就在当前会话上执行。这种方式适合开发阶段你刚写完一段VBScript不确定逻辑对不对先用菜单跑一遍观察输出再逐步调。这里有个容易被忽略的细节SecureCRT脚本是基于当前会话运行的。也就是说脚本的操作对象就是这个SSH窗口对应的连接窗口里正在登录哪台设备脚本就操作哪台。如果你在脚本里写crt.Screen.Send(show version vbcr)命令会被发送到当前窗口的终端里效果和你手动敲一模一样。2.2 高频操作绑到按钮栏把脚本变成“一键动作”调试稳定后再把脚本绑到按钮栏日常使用就不需要反复打开“运行脚本”对话框了。操作路径菜单View - Button Bar打开按钮栏右键工具栏空白区域选择“编辑按钮”在按钮配置里指定要关联的脚本即可。我习惯把“登录后健康检查”“开启日志”“关闭日志”“批量巡检”四个按钮放在最前面后面接常用快捷键日常工作基本全程不碰命令行输入。绑定按钮有一个额外好处只要当前会话处于已连接状态按一下按钮脚本就开始跑不用切窗口、不用找文件、不用确认路径。我把巡检脚本绑到按钮之后同事上手成本几乎为零他只需要知道“按这个键”就行。2.3 命令行静默执行给计划任务用第三个运行入口是命令行参数。SecureCRT支持启动时携带连接参数和脚本路径一条命令完成“连接设备、执行脚本、保存日志”整个过程。C:\Program Files\VanDyke Software\SecureCRT\SecureCRT.exe /SSH2 /L admin 10.10.10.10 /SCRIPT C:\scripts\login_check.vbs这条命令适合Windows计划任务场景。比如每天凌晨2点跑一遍全网设备巡检不弹交互窗口直接把日志写入共享目录。注意路径带空格时务必加引号脚本路径和连接参数之间不要写成全角逗号。3. crt对象三件套Screen、Session和Dialog3.1 crt.Screen发送命令和等待回显的基石脚本里打交道最多的就是crt.Screen。向下看它负责发命令向上看它负责“看”设备回显。最常用的四个成员crt.Screen.Synchronous True crt.Screen.Send(show version vbcr) crt.Screen.WaitForString(#, 10) strText crt.Screen.Get(0, 0, crt.Screen.CurrentRow, 200)Synchronous这个属性我把它排在第一位因为它直接决定脚本的稳定程度。把它设为True后Send命令和屏幕刷新进入“同步模式”相当于让脚本跟着终端画面走而不是闭着眼睛把命令一个个砸出去。你不设置它很多第一次写SecureCRT脚本的人就会碰到“命令发出去了但设备没反应过了一会儿一堆命令一起生效”的诡异现象。WaitForString是另一个核心它让脚本在一个合理的等待时间范围内等某个字符串出现在屏幕上。比如登录设备后等Password:提示符提权后等#提示符命令回显结束后再等#回来确保上一条命令执行完再发下一条。Get用来把当前屏幕上已经显示出来的内容抓成文本传到脚本里做分析。配合CurrentRow属性可以只截取最近若干行避免把半天前的回显一起抓进去。3.2 crt.Session连接、断开和日志开关crt.Session负责会话级动作。最典型的三个用法主动连接设备、断开连接、控制日志文件。crt.Session.Disconnect crt.Session.Connect(/SSH2 /L admin 10.10.10.10, False) crt.Session.LogFileName C:\logs\device1.log crt.Session.Log(True)Connect方法接收一个连接串格式跟在SecureCRT“快速连接”对话框里看到的参数一致。批量巡检时我会在脚本循环里反复调用Connect和Disconnect让程序一台紧接着一台设备处理。日志部分特别实用。以前需要手工Options - Session Options里配置日志路径现在脚本里直接指定文件名和开关状态一套批量流程能自动给每台设备生成独立日志文件。3.3 crt.Dialog和crt.Clipboard人机交互的窗口脚本完全不和人交互也不行有些信息必须运行时输入。crt.Dialog就承担这个角色。sPassword crt.Dialog.Prompt(请输入设备密码, 批量巡检, )Prompt会弹出一个输入框脚本暂停在这里等用户输入返回值就是输入内容。这样密码不会写死在脚本文件里就算脚本被别人拿来运行他对自己要输密码这件事也没有任何意外。crt.Clipboard提供剪贴板读取能力适合从外部系统复制一批IP列表脚本再逐个处理。Clipboard对象的具体操作可以在SecureCRT安装目录的脚本帮助文档里查到这里不展开。4. 实战一自动登录跳板机后执行一组健康检查VBScript版4.1 登录后自动执行挂到会话配置里第一个脚本针对的场景很常见跳板机登录成功后你需要先确认系统时间、查看登录节点、检查最近错误日志。过去这些手工要敲三到五条命令现在可以在会话配置里挂一个脚本。操作位置Session Options - Login Actions - Automation勾选“连接后自动执行脚本”选择写好的login_check.vbs。之后每次连接这台跳板机脚本都会自动运行人只需要在弹窗里输入密码。4.2 一段可直接改用的登录后检查脚本下面这段我留在现网用了快两年结构很典型所有网络设备通用。Sub Main Dim sEnablePwd crt.Screen.Synchronous True 等待用户态提示符 If crt.Screen.WaitForString(, 5) False Then crt.Dialog.MessageBox 未等到用户态提示符, 登录检查 Exit Sub End If 进入特权模式 crt.Screen.Send(enable vbcr) If crt.Screen.WaitForString(Password:, 3) False Then crt.Dialog.MessageBox 未等到enable密码提示, 登录检查 Exit Sub End If sEnablePwd crt.Dialog.Prompt(请输入enable密码, 登录检查, ) crt.Screen.Send(sEnablePwd vbcr) If crt.Screen.WaitForString(#, 5) False Then crt.Dialog.MessageBox enable失败请检查密码, 登录检查 Exit Sub End If 去掉分页输出避免命令被截断 crt.Screen.Send(term length 0 vbcr) crt.Screen.WaitForString(#, 3) 执行健康检查命令 crt.Screen.Send(show version vbcr) crt.Screen.WaitForString(#, 10) crt.Screen.Send(show clock vbcr) crt.Screen.WaitForString(#, 10) crt.Screen.Send(show ip interface brief vbcr) crt.Screen.WaitForString(#, 15) End Sub脚本的逻辑很直白等提示符、发enable、等密码提示、弹窗读密码、进入#状态后关分页、依次执行三条命令。每一步都做了超时等待任何一步等不到预期字符串脚本立即弹窗报告并退出而不是蒙着头继续往下跑。4.3 密码处理宁可多一次弹窗也别在脚本里写死刚才脚本里你看到了crt.Dialog.Prompt密码是通过弹窗实时输入的。很多人图省事会把crt.Screen.Send(mypassword vbcr)直接写死在脚本里我不建议这么做原因有二。其一是脚本文件会散开。一个脚本被传到同事机器上里面的密码就是全员可见你又不能确保每个拿到脚本的人都是授权范围。其二是生产环境的密码会变。一旦设备改密脚本思密达逼着你改文件再分发越改越乱。用Prompt接收密码脚本本身变成纯逻辑与真实凭证彻底解耦。4.4 超时分支不是可有可无注意脚本里几乎每个WaitForString后面都有If ... False Then判断。这不是凑字数是真实踩坑换来的。网络设备的老化问题很普遍慢的时候一条show指令可能卡十几秒才回提示符。如果你不管超时脚本会按照顺序往下发命令结果就是设备还在处理上一条命令下一条命令已经进入输入缓冲回显错位、输出丢失最后保存的日志根本没参考价值。每一个超时判断都是“止损点”等不到就明确失败而不是让错误无限蔓延。5. 实战二批量巡检10台设备日志自动落盘并提取状态5.1 日志文件命名给每次巡检留个“档案号”批量巡检的价值很大程度体现在日志文件名上。文件名要能回答三个问题哪天巡检的、检的是哪台设备、这是第几轮巡检。我的命名规则是yyyyMMdd_hostname.log。用VBScript内置日期函数拼接。logName Year(Now) Right(0 Month(Now), 2) Right(0 Day(Now), 2) _ host .log crt.Session.LogFileName C:\logs\ logName crt.Session.Log(True)Right(0 Month(Now), 2)的目的是保证月份和日期是两位数字比如3月会得“03”避免出现202539这种歧义文件名。日志开关打开之后连接期间所有屏幕输出都会写入这个文件比手工保存全得多。5.2 批量巡检的循环架构把连接动作封装成函数批量巡检和单机脚本不一样它需要反复执行“连接设备、输密码、等提示符、跑命令、断开”这一整套。如果把整套逻辑平铺在Main里代码会非常冗长而且某一台设备卡住时后面所有设备都受影响。我习惯把单台设备巡检封装成Sub CheckHost主流程只负责遍历主机列表。Sub Main Dim hosts, host, sPassword Dim fso, outFile hosts Array(192.168.1.11, 192.168.1.12, 192.168.1.13) sPassword crt.Dialog.Prompt(请输入SSH密码, 批量巡检, ) Set fso CreateObject(Scripting.FileSystemObject) Set outFile fso.CreateTextFile(C:\scripts\check_ Year(Now) Month(Now) Day(Now) .csv, True) For Each host In hosts Call CheckHost(host, sPassword, outFile) Next outFile.Close crt.Dialog.MessageBox 巡检完成结果已写入CSV, 批量巡检 End Sub这里hosts数组里就是这次要巡检的IP或主机名。数组的好处是方便改动今天巡检10台就把数组写10个元素明天巡检3台就留3个。如果你有批量IP从外部文件读入可以用FileSystemObject读文本行再存入数组。5.3 单台设备巡检里的日志和回显提取CheckHost函数内部完成连接、验证、执行命令、抓取文本、分析状态五个动作。Sub CheckHost(host, sPassword, outFile) Dim logName Dim strText Dim re, colMatches, m 断开当前连接确保干净起点 crt.Session.Disconnect 连接设备等待密码提示 crt.Session.Connect(/SSH2 /L admin host, False) If crt.Screen.WaitForString(Password:, 10) False Then outFile.WriteLine host ,login timeout Exit Sub End If crt.Screen.Send(sPassword vbcr) If crt.Screen.WaitForString(#, 10) False Then outFile.WriteLine host ,login failed Exit Sub End If 打开日志文件 logName Year(Now) Right(0 Month(Now), 2) Right(0 Day(Now), 2) _ host .log crt.Session.LogFileName C:\logs\ logName crt.Session.Log(True) 关闭分页并发命令 crt.Screen.Send(term length 0 vbcr) crt.Screen.WaitForString(#, 3) crt.Screen.Send(show version vbcr) crt.Screen.WaitForString(#, 15) 抓取屏幕文本 strText crt.Screen.Get(0, 0, crt.Screen.CurrentRow, 200) 从回显中提取设备版本号 Set re CreateObject(VBScript.RegExp) re.Pattern Version\s([^\s,]) re.IgnoreCase True re.Global True Set colMatches re.Execute(strText) If colMatches.Count 0 Then outFile.WriteLine host ,version colMatches(0).SubMatches(0) Else outFile.WriteLine host ,versionunknown End If 关闭日志并断开 crt.Session.Log(False) crt.Session.Disconnect End SubWaitForString用到的超时参数建议根据设备实际响应调整。老设备我通常会放宽到15秒新设备5秒就够。超时设得太大会让整个巡检变慢设得太小又容易误报。生产环境的推荐做法是先手工测试一两台记录每条命令的平均响应时间再在脚本里放大到1.5倍。5.4 正则表达式帮你从回显里“抠出”关键信息脚本跑完之后除了日志文件我还会生成一个CSV汇总方便当天扫一眼全网状态。上面脚本里的正则就是从show version回显里提取版本号。VBScript用正则的方式是创建RegExp对象设置Pattern、IgnoreCase、Global再执行Execute。Pattern Version\s([^\s,])这个模式匹配“Version”后面第一个非空字段像版本号15.2(4)M12能被直接抓出来。如果你需要抓接口状态、CPU使用率同样思路把Pattern改成对应的关键字上下文即可。CSV汇总的好处是可以用Excel批量查看也可以进一步被其他监控程序消费。脚本结束后我会顺手把CSV复制到一个按周分组的目录里作为每天巡检的历史基线。6. 脚本翻车现场几个必须记住的排错场景6.1 没开同步模式命令先于回显到达全线乱套这是SecureCRT脚本新手最常踩的坑没有之一。crt.Screen.Synchronous默认是False如果脚本里不加这句Send函数发命令时根本不管终端屏幕当前在显示什么。当设备还在处理上一条命令时你下一条命令已经发出去了。在慢速设备上你会在日志里看到一大串命令按顺序落进了输入缓冲最后只执行了一条其他全变成乱码。我的排查思路是这样的先确认脚本发出命令的顺序没问题再确认每一步都等到回显标志或#如果仍然出现命令堆积十有八九就是Synchronous属性没设置。解决方法只需在Sub Main第一行加上crt.Screen.Synchronous True。6.2 WaitForString参数顺序字符串在前还是超时在前WaitForString的完整签名是WaitForString(bstrString, [nTimeoutInSeconds])也就是说先写要等什么再写等多久。这样用是对的If crt.Screen.WaitForString(#, 10) False Then如果把顺序记反写成WaitForString(10, #)脚本会把10当成要匹配的字符串大概率永远匹配不到超时更长白等。排查这类问题时我会先打开脚本日志观察“等待开始”和“超时返回”的时间线基本一眼就能看出参数顺序是否写反。6.3 换行符和中文乱码两个隐蔽细节SecureCRT终端模式下按回车发送给设备的其实是CR回车符\r不是Windows常见的\r\n。用VBScript的时候字符串末尾接vbcr就够。有人顺手用vbcrlf有些设备会因此多出一个换行看起来像多敲了一个回车轻则命令提前执行重则产生额外空白命令。我的习惯是统一写成vbcr。中文乱码多数和脚本文件编码有关。VBScript解释器老你如果用UTF-8无BOM格式保存脚本写中文注释或匹配中文回显时容易出乱码。稳妥做法是脚本文件保存为ANSI编码如果脚本里主要是英文和正则确保注释尽量用英文或直接去掉非必要中文。Python脚本在这块宽容得多但也要在连接属性里把终端编码设置为UTF-8。6.4 脚本报错没有提示让错误路径“吐”出来VBScript写错了SecureCRT有时会弹一个错误框有时会静默退出。静默退出最难受你不知道脚本在哪个位置断了。我的做法是在关键节点加日志输出或者临时用crt.Dialog.MessageBox打出某个变量的值。crt.Dialog.MessageBox 当前抓取文本前300字符 Left(strText, 300), 调试Left(strText, 300)只显示回显前300字符信息直观且不会刷屏。定位完问题再删掉这行正式版本保持干净。7. 2025年落地建议版本、编码和脚本库管理7.1 版本环境新老版本脚本的兼容性相差不大我手头有跑老版本SecureCRT的Windows服务器也有用9.x的日常办公本。老版本跑VBScript完全没问题但跑Python脚本可能存在不支持的情况建议在目标机器上先跑一个最小验证脚本确认crt对象能正常被Python解释器识别再放完整代码过去。7.2 脚本也是代码建议纳入版本管理我见过很多同事的脚本文件名叫final_v2_ok.vbs里面改了多少版完全凭记忆。SecureCRT脚本虽然小但维护周期可以很长强烈建议放进Git仓库。这样每次改密码逻辑、改等待时间、增加巡检命令都有记录可查。出了问题回滚到上一个版本比对着“最终版”猜要靠谱得多。7.3 合规使用脚本功能不需要额外购买特权SecureCRT是商业软件但脚本功能包含在标准授权能力里不需要额外买什么模块。官方提供了试用期生产环境请务必通过正规渠道获取授权。我在实际使用中也没有依赖任何第三方插件纯靠软件自带的对象模型就能完成这些自动化工作。如果你认真把文中几个脚本跑通至少能省下每天半小时的重复操作。剩余的时间足够你去调教更复杂的自动化场景了。