diff --git a/internal/device/parser.go b/internal/device/parser.go index 85d0b5e..5790414 100644 --- a/internal/device/parser.go +++ b/internal/device/parser.go @@ -1,6 +1,7 @@ package device import ( + "fmt" "network-topology-discovery/pkg/models" sshclient "network-topology-discovery/internal/ssh" ) @@ -74,12 +75,17 @@ func DiscoverDevice(ip string, deviceType models.DeviceType, username, password // 获取命令列表 commands := parser.GetCommands() - // 执行命令 - outputs, err := client.ExecuteCommands(commands) - if err != nil { - device.ScanStatus = "failed" - device.ErrorMessage = err.Error() - return device, err + // 执行命令 - 允许部分命令失败 + outputs := make([]string, 0, len(commands)) + for _, cmd := range commands { + output, err := client.ExecuteCommand(cmd) + if err != nil { + // 记录警告但继续执行其他命令 + fmt.Printf("Warning: command '%s' failed: %v\n", cmd, err) + outputs = append(outputs, "") + } else { + outputs = append(outputs, output) + } } // 解析输出 diff --git a/internal/ssh/client.go b/internal/ssh/client.go index f46188e..e3534fb 100644 --- a/internal/ssh/client.go +++ b/internal/ssh/client.go @@ -121,9 +121,25 @@ func (c *Client) ExecuteCommand(command string) (string, error) { return "", fmt.Errorf("not connected") } - session, err := c.client.NewSession() + // 重试机制,处理会话创建失败的情况 + var session *ssh.Session + var err error + maxRetries := 3 + + for i := 0; i < maxRetries; i++ { + session, err = c.client.NewSession() + if err == nil { + break + } + + // 如果是会话拒绝错误,等待后重试 + if i < maxRetries-1 { + time.Sleep(time.Duration(i+1) * 500 * time.Millisecond) + } + } + if err != nil { - return "", fmt.Errorf("failed to create session: %w", err) + return "", fmt.Errorf("failed to create session after %d retries: %w", maxRetries, err) } defer session.Close()