从调试输出中发现的关键问题:
[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
...
问题分析:
screen-length disable 命令失败,但影响了后续处理SSH客户端的 ExecuteCommands 函数存在以下问题:
stdoutBuf,没有清空strings.Split 分割,取倒数第二部分,导致前面的命令输出被包含cleanCommandOutput 无法有效处理混杂的输出// 记录上一个分隔符的位置
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
// 每次命令执行后清空缓冲区,避免累积(重要!)
stdoutBuf.Reset()
stderrBuf.Reset()
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
}
fmt.Printf("[SSH DEBUG] Sending command: %s\n", cmd)
fmt.Printf("[SSH DEBUG] Extracted between delimiters: start=%d, end=%d\n", startIdx, endIdx)
修复后,系统应该能够:
正确分离每个命令的输出
正确解析ARP表
正确解析LLDP邻居
显示更清晰的调试信息
运行修复后的程序:
.\network-topology.exe
通过Web界面添加设备 172.16.8.1
查看控制台输出的调试信息:
[SSH DEBUG] - SSH命令发送和提取过程[H3C ARP DEBUG] - ARP表解析详情[H3C LLDP DEBUG] - LLDP邻居解析详情验证结果:
screen-length disable 命令失败:某些H3C设备版本不支持此命令,但已通过清空缓冲区解决display interface)需要更长时间等待如果问题仍然存在,可以考虑:
screen-length disable)