Ruijie 设备巡检脚本全解析(SecureCRT JScript 版)
一、脚本整体概述
你提供的这段脚本是基于 SecureCRT 环境的 JScript 脚本,主要用于锐捷(Ruijie)网络设备的自动化巡检。脚本核心能力包括:设备权限 / 型号 / 版本校验、设备健康状态检查(CPU / 内存使用率)、多模式命令执行(普通 / 配置 / Shell / 调试模式)、间隔采集任务管理等,最终自动执行预设的巡检命令集并输出标记化结果,是企业级网络设备自动化运维的典型实现。
二、核心模块拆解
2.1 基础常量与初始化模块
功能定位
定义脚本运行的基础常量、初始化设备标识,为后续命令执行提供环境基础。
// 设备型号与平台版本映射表(核心校验依据)
var model2platform = {"rsr20-14f v5.0":["10.x"]};
// 命令结束符(默认特权模式提示符)
var hostName = "#";
// 超时标记常量(用于命令超时标识)
var TIME_OUT_TAG = "!---cmd timeoutTag ";
// 备机标识(用于区分主备设备执行逻辑)
var backupMark = "";
/**
* 初始化设备提示符(hostName)
* 核心逻辑:发送回车获取设备当前提示符,适配不同设备的特权模式标识
*/
function initHostName() {
try {
crt.Screen.Send("\r");
var str = crt.Screen.ReadString("#", 5) + "#";
while (true) {
var s = crt.Screen.ReadString("#", 1);
if (s === '') break;
str += s + "#";
}
var lines = str.split(/[\r\n]+/);
str = lines[lines.length - 1];
hostName = str.replace(/(^\s+)|(\s+$)/g, "");
} catch (e) {
hostName = "#"; // 异常时回退到默认值
}
}
// 脚本启动时强制开启屏幕同步(CRT关键配置,保证命令执行顺序)
crt.Screen.Synchronous = true;
// 初始化设备提示符
initHostName();
关键说明
model2platform:控制脚本仅允许指定型号 + 版本的设备执行,避免脚本在不兼容设备上运行;initHostName():动态获取设备实际特权模式提示符(如设备名 +#),解决不同设备提示符不一致的问题;crt.Screen.Synchronous = true:CRT 脚本必备配置,关闭屏幕异步输出,确保命令发送 / 读取顺序可控。
2.2 字符串处理工具模块
功能定位
提供通用的正则匹配、字符串清洗工具函数,是整个脚本的 “数据处理基础库”。
/**
* 提取正则匹配的第一个分组(核心工具函数)
* @param str 待匹配字符串
* @param expr 正则表达式
* @returns {string} 清洗后的匹配结果(去首尾空格)
*/
function matchGroup1(str, expr) {
if(str === null || str === undefined) return "";
var match = str.match(expr);
if(match && match.length > 1) {
return match[1].replace(/^\s+|\s+$/g, ''); // 去首尾空格
}
return "";
}
/**
* 移除ANSI颜色序列(解决终端带颜色输出的乱码问题)
* @param text 终端输出文本
* @returns {string} 纯文本内容
*/
function removeAnsiColor(text) {
if(!text) return "";
return text.replace(/\x1B\[(\d{1,2}(;\d{1,2})?)?[m|K]/g, "");
}
关键说明
matchGroup1():全网使用频率最高的函数,用于从设备输出中提取核心信息(如版本号、CPU 使用率、型号等);removeAnsiColor():适配部分设备带颜色的终端输出,避免特殊字符干扰数据解析。
2.3 设备校验模块(showVersionCheck)
功能定位
执行脚本前的 “准入校验”,确保设备满足脚本运行条件:特权模式、型号兼容、版本兼容。
function showVersionCheck() {
// 1. 特权模式校验
crt.screen.Send("\r");
var index = crt.Screen.WaitForString(hostName, 20);
if(index === 0){
crt.Dialog.MessageBox('当前设备不是处于特权模式,请先进入特权模式再执行脚本');
return false;
}
// 2. 获取版本信息(适配特殊版本需要show version detail)
crt.screen.Send("show version\r\n");
var versionText = crt.screen.ReadString(hostName, 30);
if(/RGOS 10.4\(2B17\)-SP2/.test(versionText)) {
crt.screen.Send("show version detail\r\n");
versionText = crt.screen.ReadString(hostName, 30);
}
// 3. 提取设备型号(优先识别AP型号,再识别通用型号)
var apModel = getApModel(versionText);
var model = !apModel
? matchGroup1(versionText, /System description\s*:[^\(]*\((.*)\) *By/i)
: apModel;
model = model.toLowerCase().replace(/^\s+|\s+$/g, '');
if (model.search(/^rg-/i) !== -1) model = model.replace('rg-','');
// 4. 型号兼容性校验
var platformArr = model2platform[model];
if(!platformArr || !platformArr.length){
crt.Dialog.MessageBox('该脚本无法在该型号下执行,请确认下载的脚本是正确的!');
return false;
}
// 5. 版本兼容性校验
var arr = [];
for (var i = 0; i < platformArr.length; i++) {
if(platformArr[i] == 'all') return true;
arr.push(matchGroup1(platformArr[i],/([^.]+)/i));
}
var softwareVersion = matchGroup1(versionText, /System software version\s*:\s*(.*)/i);
var pos = softwareVersion.indexOf('ystem');
if (pos >= 1) softwareVersion = softwareVersion.substring(0, pos - 1);
var platformPrefix = matchGroup1(softwareVersion,/\s+([^.]+)/i);
for (var i = 0; i < arr.length; i++) {
if(arr[i] == platformPrefix) return true;
}
crt.Dialog.MessageBox('该脚本无法在该版本下执行,请确认下载的脚本是正确的!');
return false;
}
/**
* 专用AP型号提取函数
* 适配AP设备的版本信息格式差异
*/
function getApModel(versionText) {
var apModel = matchGroup1(versionText,
/System description\s*:.*\s((AP|AM|IBS|RG-A[PM]).*) V\d+.\d+.*/i
);
if(!apModel){
apModel = matchGroup1(versionText,/System description\s*:.*\s((AP|AM|IBS|RG-A[PM])[^ ]+).*/i)
}
return apModel;
}
执行流程
- 特权模式校验 → 2. 版本信息采集(适配特殊版本) → 3. 设备型号提取 → 4. 型号兼容性校验 → 5. 版本兼容性校验;
关键说明
- 适配 AP 设备与普通设备的型号提取逻辑差异;
- 版本校验支持 “all” 通配符,也支持精确前缀匹配(如 10.x 匹配 10.4、10.5 等);
- 校验不通过时弹出提示并终止脚本,避免无效执行。
2.4 设备健康状态检查模块(deviceStateCheck)
功能定位
巡检前的 “健康体检”,检查设备 CPU / 内存使用率是否超标,避免在设备负载过高时执行巡检(加重设备负担)。
function deviceStateCheck(){
try{
// 内存使用率检查(重复检查逻辑,实际可优化为单次)
var state_ret_0 = (function(){
function main() {
var result = { result: 0, data: { faultRemark: "" } };
var showMemory = readString('show memory', '#', 40);
if(!!showMemory && showMemory.match(/Used Rate\s*:\s*\d+\.?\d*\s*%/i)) {
var num = showMemory.match(/Used Rate\s*:\s*(\d+\.?\d*)\s*%/i)[1].replace(/^\s+|\s+$/g, "");
if(num - 80 >= 0) { // 阈值80%
result.result = 1;
result.data.faultRemark = '内存使用率达到' + num + '%,请先查看该设备状况再进行巡检';
}
}
return result;
}
return main()})();
if(state_ret_0.result !== 0) {
crt.Dialog.MessageBox(state_ret_0.data.faultRemark);
return true;
}
// CPU使用率检查(逻辑同内存)
var state_ret_2 = (function(){
function main() {
var result = { result: 0, data: { faultRemark: "" } };
var showCpu = readString("show cpu", "#", 40);
if (!!showCpu && showCpu.match(/CPU utilization in five seconds\s*:\s*.*\s*%/i)) {
var num = showCpu.match(/CPU utilization in five seconds\s*:\s*(.*)\s*%/i)[1].replace(/^\s+|\s+$/g, "");
if (num - 80 >= 0) { // 阈值80%
result.result = 1;
result.data.faultRemark = "CPU使用率达到" + num + "%,请先查看该设备状况再进行巡检";
}
}
return result;
}
return main()})();
if(state_ret_2.result !== 0) {
crt.Dialog.MessageBox(state_ret_2.data.faultRemark);
return true;
}
// 注:脚本中存在重复的内存/CPU检查逻辑(state_ret_1/3),属于冗余代码,可删除
}catch(e){
crt.Dialog.MessageBox('执行状态前检查项出现异常,中止采集!异常信息:\r\n' + e);
return true;
}
return false;
}
关键说明
- 核心阈值:CPU / 内存使用率≥80% 时终止巡检,可根据实际需求调整;
- 脚本中存在重复检查逻辑(如两次内存、两次 CPU 检查),属于冗余代码,优化时可合并;
- 异常捕获:避免健康检查环节出错导致脚本崩溃,提升鲁棒性。
2.5 命令执行核心模块
功能定位
封装不同模式下的命令执行逻辑,解决 CRT 命令执行的超时、分页、模式切换等问题,是脚本的 “执行引擎”。
2.5.1 基础执行函数
/**
* 发送命令并等待执行完成(基础版)
* @param commandText 待执行命令
* @param endChar 结束符
* @param timeout 超时时间(秒)
* 特性:支持分页(--More--)、备机标识、超时重试
*/
function execute(commandText, endChar, timeout) {
crt.screen.Send(commandText + "\r");
if (typeof (xsh) === "undefined") crt.Sleep(200); // 兼容CRT/Xshell
var ret = 0;
// 备机模式:处理分页输出(--More--)
if(backupMark.indexOf('backup') > -1){
ret = crt.screen.WaitForStrings(endChar,'--More--', timeout);
while(ret == 2){ // 2代表匹配到--More--
crt.screen.Send(" "); // 发送空格翻页
ret = crt.screen.WaitForStrings(endChar,'--More--', timeout);
}
}else{
ret = crt.screen.WaitForStrings(endChar, timeout);
}
return ret;
}
/**
* 发送命令并读取输出(返回文本版)
* @param commandText 待执行命令
* @param endChar 结束符
* @param timeout 超时时间(秒)
* 用途:需要获取命令输出内容时使用(如健康检查)
*/
function readString(commandText, endChar, timeout) {
crt.screen.Send(commandText + "\r");
if (typeof (xsh) === "undefined") crt.Sleep(200);
return crt.screen.ReadString(endChar, timeout);
}
2.5.2 模式化执行函数
针对设备不同配置模式封装的专用执行函数:
/**
* 普通模式命令执行(带标记)
* 功能:执行前发送标记(便于后续解析),支持单命令/多命令
*/
function executeWithTag() {
if (arguments.length === 1) {
var commandText = arguments[0];
execute("!---cmd " + backupMark + commandText, hostName, 10);
execute(commandText, hostName, 120);
} else {
var name = arguments[0];
var commandTexts = arguments[1];
execute("!---cmd " + backupMark + name, hostName, 10);
for (var i = 0; i < commandTexts.length; i++) {
execute(commandTexts[i], hostName, 120);
}
}
}
/**
* Shell模式命令执行
* 流程:进入run-system-shell → 执行命令 → 退出Shell
*/
function executeWithShell() {
// 核心逻辑:模式切换 + 命令执行 + 模式退出
}
/**
* 配置模式命令执行
* 流程:进入conf t → 执行命令 → 退出配置模式
*/
function executeWithConfig() {
// 核心逻辑:模式切换 + 命令执行 + 模式退出
}
/**
* 调试模式命令执行
* 流程:进入debug support → 执行命令 → 退出调试模式
*/
function executeWithDebug() {
// 核心逻辑:模式切换 + 命令执行 + 模式退出
}
关键说明
- 模式切换逻辑:所有模式化执行函数均包含 “进入模式→执行命令→退出模式” 的完整流程,避免残留模式影响后续执行;
- 标记机制:执行前发送
!---cmd xxx标记,便于后续解析巡检结果时快速定位命令对应的输出; - 超时控制:普通命令超时 10 秒,核心巡检命令超时 120 秒,适配不同命令的执行耗时;
- 分页处理:备机模式下自动处理
--More--分页,确保输出完整。
2.6 间隔采集任务模块
功能定位
支持 “间隔多次采集” 的场景(如连续采集 3 次 CPU 使用率,间隔 5 秒),满足动态指标的巡检需求。
// 间隔采集任务队列
var intervalQueue = [];
/**
* 添加间隔采集任务
* @param func 采集任务函数
* @param minIntervalSeconds 执行间隔(秒)
* @param times 执行次数
* @param immediately 是否立即执行第一次(默认是)
*/
function addIntervalQueue(func, minIntervalSeconds, times, immediately) {
if (typeof func !== "function" || typeof minIntervalSeconds !== "number" || typeof times !== "number" || minIntervalSeconds <= 0 || times <= 0) {
return;
}
var _times = times;
if(immediately === undefined || immediately) {
func();
_times--;
}
if (_times <= 0) return;
var task = {
startTime: new Date().getTime(),
minIntervalSeconds: minIntervalSeconds * 1000,
func: func,
maxTimes: _times,
currentTimes: 0
};
intervalQueue.push(task);
}
/**
* 检查并执行到期的间隔任务
* 核心:判断任务是否达到执行间隔,执行后更新任务状态
*/
function checkAndRunIntervalQueue() {
for (var i = 0; i < intervalQueue.length; i++) {
var task = intervalQueue[i];
var now = new Date().getTime();
if (task.startTime + task.minIntervalSeconds > now) continue;
task.func();
task.currentTimes++;
task.startTime = new Date().getTime();
}
// 移除执行完成的任务
for (var i2 = intervalQueue.length - 1; i2 >= 0; i2--) {
if (intervalQueue[i2].currentTimes >= intervalQueue[i2].maxTimes) {
intervalQueue.splice(i2, 1);
}
}
}
/**
* 最终等待所有间隔任务完成
* 特性:循环检查+休眠(减少CPU占用),每30秒发送回车保活(避免设备断开)
*/
function finalCheckAndRunIntervalQueue() {
var tick = 0;
while (intervalQueue.length > 0) {
checkAndRunIntervalQueue();
if(typeof(crt) !== "undefined") {
crt.sleep(1000);
if(++tick % 30 === 0) crt.Screen.Send("\r"); // 30秒保活
} else if(typeof(jdbc) !== "undefined") {
jdbc.sleep(1000);
}
}
}
关键说明
- 任务生命周期:添加任务→立即执行(可选)→ 间隔执行剩余次数 → 执行完成后移除;
- 保活机制:长时间间隔采集时,每 30 秒发送回车,避免设备因超时断开连接;
- 资源优化:每次循环休眠 1 秒,避免脚本占用过高 CPU。
2.7 主执行流程模块
功能定位
脚本入口逻辑,串联所有模块,执行完整的巡检流程。
// 1. 初始化终端(关闭分页、设置宽度)
executeWithTag('init',['terminal length 0','terminal width 256']);
// 2. 发送分隔符标记
executeWithTag('splitter', ['!---mark splitter:!---cmd']);
// 3. 标记插件ID
executeWithTag('pluginId',['!---mark _pluginId_:ruijie_ROUTER_MID_NEW']);
// 4. 标记主设备
execute('!---cmd master', '#', 10);
// 5. 设备校验 + 健康检查
if(showVersionCheck()){
if(!deviceStateCheck()){
// 6. 执行核心巡检命令集(覆盖设备版本、CPU、内存、接口、路由等)
executeWithTag('show manuinfo');
executeWithTag('show cell info modem');
// ... 省略其他巡检命令 ...
executeWithDebug('show exception');
// 7. 等待所有间隔任务完成
finalCheckAndRunIntervalQueue();
// 8. 标记采集完成
executeWithTag('collection finished', ['!---mark ' + new Date(), 'terminal no length']);
}
}
执行流程
初始化终端 → 设备校验 → 健康检查 → 执行巡检命令 → 间隔任务收尾 → 标记完成;
关键说明
- 巡检命令覆盖:设备基本信息、硬件状态(风扇 / 电源 / 告警)、接口状态、路由、VPN、CPU / 内存、日志等,全面覆盖网络设备核心巡检维度;
- 兼容调试模式:部分敏感命令(如 show exception)通过调试模式执行,提升巡检深度。
三、脚本优化建议
- 冗余代码清理:
deviceStateCheck中重复的内存 / CPU 检查逻辑可合并为单次检查; - 配置化改造:将
model2platform、巡检命令集、CPU / 内存阈值等抽离为独立配置段,便于维护; - 日志输出:增加脚本执行日志(如输出到文件),便于问题排查;
- 错误重试:核心命令执行超时后增加重试逻辑,提升脚本稳定性;
- 输出格式化:将巡检结果输出为 JSON/CSV 格式,便于后续数据分析。
四、应用场景与价值
- 企业级网络巡检:替代人工逐条执行命令,提升巡检效率,降低人为失误;
- 批量设备运维:配合 CRT 的批量执行功能,实现多设备统一巡检;
- 故障前置预警:通过 CPU / 内存阈值检查,提前发现设备负载问题;
- 合规审计:标记化的巡检结果可作为网络合规审计的依据。
总结
- 该脚本是一套完整的锐捷设备自动化巡检解决方案,核心分为 “校验层(设备 / 版本 / 健康)”“执行层(多模式命令)”“任务层(间隔采集)” 三大核心层级;
- 脚本充分考虑了 CRT/Xshell 兼容性、设备模式切换、分页处理、超时控制等细节,具备企业级运维脚本的鲁棒性;
- 核心设计思路是 “先校验后执行、模式化封装、标记化输出”,既保证了脚本的安全性,又便于后续结果解析。

869

被折叠的 条评论
为什么被折叠?



