SSH_OUTPUT_FIX.md 4.2 KB

SSH命令输出处理修复说明

🔍 问题诊断

从调试输出中发现的关键问题:

1. SSH命令输出混乱

[H3C ARP DEBUG] First 500 chars of ARP Output:
******************************************************************************

screen-length disable
<BJ-FW01-New>screen-length disable
<BJ-FW01-New>echo ===CMD_BOUNDARY_0===
^
% Unrecognized command found at '^' position.
<BJ-FW01-New>display version
H3C Comware Software, Version 7.1.064, Release 9323P25
...

问题分析

  • ARP命令的输出包含了前面所有命令的输出(version、interface等)
  • 分隔符处理逻辑有缺陷,导致命令输出混在一起
  • screen-length disable 命令失败,但影响了后续处理

2. 根本原因

SSH客户端的 ExecuteCommands 函数存在以下问题:

  1. 缓冲区累积:所有命令的输出都写入同一个 stdoutBuf,没有清空
  2. 分隔符处理错误:使用 strings.Split 分割,取倒数第二部分,导致前面的命令输出被包含
  3. 清理逻辑不足cleanCommandOutput 无法有效处理混杂的输出

修复方案

1. 改进分隔符处理逻辑

// 记录上一个分隔符的位置
lastDelimiter := ""

// 正确提取当前命令的输出
if lastDelimiter != "" {
    // 找到上一个分隔符和当前分隔符之间的内容
    startIdx := strings.LastIndex(rawOutput, lastDelimiter)
    endIdx := strings.LastIndex(rawOutput, delimiter)
    
    if startIdx >= 0 && endIdx >= 0 && endIdx > startIdx {
        cmdOutput = rawOutput[startIdx+len(lastDelimiter):endIdx]
    }
} else {
    // 第一个命令:从开头到第一个分隔符
    endIdx := strings.Index(rawOutput, delimiter)
    if endIdx >= 0 {
        cmdOutput = rawOutput[:endIdx]
    }
}

lastDelimiter = delimiter

2. 清空缓冲区

// 每次命令执行后清空缓冲区,避免累积(重要!)
stdoutBuf.Reset()
stderrBuf.Reset()

3. 增加等待时间

sleepTime := 1 * time.Second
if cmd == "display interface" || strings.Contains(cmd, "display interface") {
    sleepTime = 10 * time.Second // 大输出命令需要更多时间
} else if strings.Contains(cmd, "display lldp") {
    sleepTime = 5 * time.Second
} else if strings.Contains(cmd, "display arp") {
    sleepTime = 5 * time.Second
}

4. 添加调试信息

fmt.Printf("[SSH DEBUG] Sending command: %s\n", cmd)
fmt.Printf("[SSH DEBUG] Extracted between delimiters: start=%d, end=%d\n", startIdx, endIdx)

🚀 预期效果

修复后,系统应该能够:

  1. 正确分离每个命令的输出

    • ARP命令只包含ARP表数据
    • LLDP命令只包含LLDP邻居信息
    • 不再有命令输出混杂的问题
  2. 正确解析ARP表

    • 解析器能够正确处理纯净的ARP表数据
    • 建立正确的IP-MAC映射
  3. 正确解析LLDP邻居

    • 解析器能够正确处理纯净的LLDP输出
    • 提取邻居设备信息
  4. 显示更清晰的调试信息

    • 命令发送过程
    • 分隔符提取过程
    • 输出长度信息

📝 测试步骤

  1. 运行修复后的程序:

    .\network-topology.exe
    
  2. 通过Web界面添加设备 172.16.8.1

  3. 查看控制台输出的调试信息:

    • [SSH DEBUG] - SSH命令发送和提取过程
    • [H3C ARP DEBUG] - ARP表解析详情
    • [H3C LLDP DEBUG] - LLDP邻居解析详情
  4. 验证结果:

    • ARP表应该有多个条目(不再是0)
    • LLDP邻居应该有数据(如果设备上有邻居)
    • 拓扑图应该显示设备间连接

⚠️ 注意事项

  1. screen-length disable 命令失败:某些H3C设备版本不支持此命令,但已通过清空缓冲区解决
  2. 命令等待时间:大输出命令(如 display interface)需要更长时间等待
  3. 设备兼容性:修复后的代码能更好地处理不同设备类型的输出

🔧 后续改进

如果问题仍然存在,可以考虑:

  1. 改进清理逻辑:更智能地识别和过滤命令回显
  2. 错误处理:忽略失败的命令(如 screen-length disable
  3. 兼容性检测:自动检测设备类型,使用正确的命令集