v1.0.1: 多拓扑管理、Web SSH终端、扫描进度修复、拓扑连线优化
- 修复扫描进度条不动的问题(分4阶段更新进度) - 新增Web SSH远程终端(xterm.js + WebSocket) - 新增多拓扑管理(创建/切换拓扑、全局设备池) - 简化新建拓扑流程(仅需名称,创建后选择设备) - 修复拓扑Builder设备去重(按IP去重) - 修复启动时拓扑设备不加载到Builder的问题 - 优化MAC前缀匹配(避免歧义前缀导致错误连线) - 拓扑连线改为无向(去除箭头) - 设备详情面板加宽到600px
Tento commit je obsažen v:
@@ -0,0 +1,140 @@
|
||||
# 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. **兼容性检测**:自动检测设备类型,使用正确的命令集
|
||||
Odkázat v novém úkolu
Zablokovat Uživatele