Files
Your Name 44f7fef1f8 v1.0.1: 多拓扑管理、Web SSH终端、扫描进度修复、拓扑连线优化
- 修复扫描进度条不动的问题(分4阶段更新进度)
- 新增Web SSH远程终端(xterm.js + WebSocket)
- 新增多拓扑管理(创建/切换拓扑、全局设备池)
- 简化新建拓扑流程(仅需名称,创建后选择设备)
- 修复拓扑Builder设备去重(按IP去重)
- 修复启动时拓扑设备不加载到Builder的问题
- 优化MAC前缀匹配(避免歧义前缀导致错误连线)
- 拓扑连线改为无向(去除箭头)
- 设备详情面板加宽到600px
2026-04-26 13:25:19 +08:00

140 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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. **改进分隔符处理逻辑**
```go
// 记录上一个分隔符的位置
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. **清空缓冲区**
```go
// 每次命令执行后清空缓冲区,避免累积(重要!)
stdoutBuf.Reset()
stderrBuf.Reset()
```
### 3. **增加等待时间**
```go
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. **添加调试信息**
```go
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. 运行修复后的程序:
```bash
.\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. **兼容性检测**:自动检测设备类型,使用正确的命令集