SNMP获取交换机品牌型号

创建于:2024年10月14日

使用 O1 Preview 回答 Chat01

问题

有华为交换机、华三交换机、锐捷交换机三个品牌的交换机,通过snmp的哪个oid可以获取到各个设备的品牌和型号,并给出nodejs的详细代码逻辑

思考

了解问题

首先,问题是中文的,需要翻译,然后解释如何通过SNMP获取每种设备的品牌和型号,并附上详细的Node.js代码逻辑。

收集和编写

收集开放设备(Huawei、H3C和Ruijie)的品牌和型号信息,并用Node.js逻辑写出详细的SNMP OID代码。确保代码正确、格式正确、功能健全。

获取设备信息

通过SNMP库'net-snmp',我们可以使用sysDescr和sysObjectID属性获取设备的品牌和型号。

查询设备基本信息

通过sysObjectID来识别设备类型,系统描述(sysDescr)和厂商特定的OID来获取详细型号。这样的方法似乎很实用呢。

回答

要通过SNMP获取华为交换机、华三(H3C)交换机和锐捷(Ruijie)交换机的品牌和型号,通常可以使用以下两个OID:

  1. sysDescr(系统描述):1.3.6.1.2.1.1.1.0
  2. sysObjectID(系统对象ID):1.3.6.1.2.1.1.2.0

这些OID是标准的SNMP系统OID,可以返回设备的描述信息和对象ID。通过解析这些信息,我们可以获取设备的品牌和型号。

下面是使用Node.js和net-snmp库的详细代码逻辑,演示如何获取并解析这些信息。

前置准备

首先,确保你已经安装了Node.js和net-snmp库:

bash
npm install net-snmp

代码实现

javascript
const snmp = require('net-snmp'); /** * 获取设备的品牌和型号信息 * @param {string} ip - 设备的IP地址 * @param {string} community - SNMP共同体字符串(默认为'public') */ function getDeviceInfo(ip, community = 'public') { // 创建SNMP会话 const session = snmp.createSession(ip, community); // 要获取的OID列表 const oids = [ '1.3.6.1.2.1.1.1.0', // sysDescr '1.3.6.1.2.1.1.2.0' // sysObjectID ]; session.get(oids, (error, varbinds) => { if (error) { console.error(`Error fetching SNMP data: ${error.message}`); } else { // 解析sysDescr和sysObjectID const sysDescr = varbinds[0].value.toString(); const sysObjectID = varbinds[1].value.toString(); console.log(`sysDescr: ${sysDescr}`); console.log(`sysObjectID: ${sysObjectID}`); // 根据sysObjectID判断设备品牌 const brand = getBrandBySysObjectID(sysObjectID); console.log(`Brand: ${brand}`); // 从sysDescr中提取型号信息 const model = getModelFromSysDescr(sysDescr); console.log(`Model: ${model}`); } // 关闭会话 session.close(); }); } /** * 根据sysObjectID获取设备品牌 * @param {string} sysObjectID * @returns {string} 设备品牌 */ function getBrandBySysObjectID(sysObjectID) { // 企业OID前缀映射 const enterpriseOIDs = { '1.3.6.1.4.1.2011': 'Huawei', '1.3.6.1.4.1.25506': 'H3C', '1.3.6.1.4.1.4881': 'Ruijie' }; for (const [oidPrefix, brand] of Object.entries(enterpriseOIDs)) { if (sysObjectID.startsWith(oidPrefix)) { return brand; } } return 'Unknown'; } /** * 从sysDescr中提取设备型号 * @param {string} sysDescr * @returns {string} 设备型号 */ function getModelFromSysDescr(sysDescr) { // 根据具体设备的sysDescr格式进行解析 // 以下是一个通用的示例,可能需要根据实际情况调整 // 示例:华为设备的sysDescr可能包含类似于"Quidway S5700 Series Switch"的信息 const modelMatch = sysDescr.match(/(?:Series|Model)\s+([\w\-]+)/i); if (modelMatch && modelMatch[1]) { return modelMatch[1]; } // 如果无法解析,则返回完整的sysDescr return sysDescr; } // 示例调用 getDeviceInfo('192.168.1.1', 'public');

代码说明

  1. 导入net-snmp:用于进行SNMP操作。
  2. 创建SNMP会话:使用目标设备的IP地址和共同体字符串。
  3. 定义要获取的OIDsysDescrsysObjectID
  4. 发送SNMP GET请求:获取OID对应的值。
  5. 解析返回的数据
    • sysDescr:获取设备的描述信息,可能包含型号和软件版本等信息。
    • sysObjectID:用于唯一标识设备类型,可以根据企业OID前缀确定品牌。
  6. 确定设备品牌:通过sysObjectID与已知的企业OID前缀进行匹配。
    • 华为的企业OID前缀是1.3.6.1.4.1.2011
    • 华三的企业OID前缀是1.3.6.1.4.1.25506
    • 锐捷的企业OID前缀是1.3.6.1.4.1.4881
  7. 提取设备型号:从sysDescr中使用正则表达式提取型号信息。

注意事项

  • 共同体字符串(Community String):通常为public,但在生产环境中可能被更改,需要使用正确的共同体字符串才能成功查询。
  • SNMP版本:以上代码默认使用SNMPv1,如果需要使用SNMPv2c或SNMPv3,需要在创建会话时进行相应配置。
  • 防火墙设置:确保网络防火墙允许SNMP通信,默认使用UDP端口161。
  • 错误处理:在实际应用中,应增加更完善的错误处理和日志记录。

结论

通过上述代码,我们可以使用标准的SNMP OID获取设备的品牌和型号信息。根据sysObjectID可以确定设备的品牌,sysDescr则提供了更详细的设备描述,可以从中提取型号信息。这个方法适用于华为、华三和锐捷等常见网络设备。

分享这个问答