Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion internal/adapters/ui/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}
Expand Down
2 changes: 1 addition & 1 deletion internal/core/ports/services.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
25 changes: 17 additions & 8 deletions internal/core/services/server_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading