From b9968a587b373132d90b069ac9bcdbdfae7f4ce8 Mon Sep 17 00:00:00 2001 From: Eberx Date: Thu, 22 Oct 2026 21:04:23 +0800 Subject: [PATCH] fix: duplicate alias selection issue This fixes following issue: When there are two servers have same alias, lazyssh always selects first one. Server selection no longer by alias, instead server selection is done by server object. --- internal/adapters/ui/handlers.go | 2 +- internal/core/ports/services.go | 2 +- internal/core/services/server_service.go | 25 ++++++++++++++++-------- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/internal/adapters/ui/handlers.go b/internal/adapters/ui/handlers.go index 897e053d..fd666c91 100644 --- a/internal/adapters/ui/handlers.go +++ b/internal/adapters/ui/handlers.go @@ -224,7 +224,7 @@ func (t *tui) handleServerConnect() { if server, ok := t.serverList.GetSelectedServer(); ok { t.app.Suspend(func() { - _ = t.serverService.SSH(server.Alias) + _ = t.serverService.SSH(server) }) t.refreshServerList() } diff --git a/internal/core/ports/services.go b/internal/core/ports/services.go index 2407269f..90ab2849 100644 --- a/internal/core/ports/services.go +++ b/internal/core/ports/services.go @@ -26,7 +26,7 @@ type ServerService interface { AddServer(server domain.Server) error DeleteServer(server domain.Server) error SetPinned(alias string, pinned bool) error - SSH(alias string) error + SSH(server domain.Server) error SSHWithArgs(alias string, extraArgs []string) error StartForward(alias string, extraArgs []string) (int, error) StopForwarding(alias string) error diff --git a/internal/core/services/server_service.go b/internal/core/services/server_service.go index 7926bc6d..9562e850 100644 --- a/internal/core/services/server_service.go +++ b/internal/core/services/server_service.go @@ -153,26 +153,35 @@ func (s *serverService) SetPinned(alias string, pinned bool) error { return err } -// SSH starts an interactive SSH session to the given alias using the system's ssh client. -func (s *serverService) SSH(alias string) error { - s.logger.Infow("ssh start", "alias", alias) - cmd := exec.Command("ssh", alias) +// SSH starts an interactive SSH session to the selected server using the system's ssh client. +func (s *serverService) SSH(server domain.Server) error { + args := sshArgs(server) + s.logger.Infow("ssh start", "alias", server.Alias, "host", server.Host) + cmd := exec.Command("ssh", args...) cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { - s.logger.Errorw("ssh command failed", "alias", alias, "error", err) + s.logger.Errorw("ssh command failed", "alias", server.Alias, "host", server.Host, "error", err) return err } - if err := s.serverRepository.RecordSSH(alias); err != nil { - s.logger.Errorw("failed to record ssh metadata", "alias", alias, "error", err) + if err := s.serverRepository.RecordSSH(server.Alias); err != nil { + s.logger.Errorw("failed to record ssh metadata", "alias", server.Alias, "error", err) } - s.logger.Infow("ssh end", "alias", alias) + s.logger.Infow("ssh end", "alias", server.Alias, "host", server.Host) return nil } +func sshArgs(server domain.Server) []string { + args := make([]string, 0, 3) + if server.Host != "" { + args = append(args, "-o", "HostName="+server.Host) + } + return append(args, server.Alias) +} + // SSHWithArgs runs system ssh with provided extra args (e.g., -L/-R/-D) for the given alias. func (s *serverService) SSHWithArgs(alias string, extraArgs []string) error { s.logger.Infow("ssh start (with args)", "alias", alias, "args", extraArgs)