From 2a1f6d54492baf32064ea1e98ca1aa5a6d5979ae Mon Sep 17 00:00:00 2001 From: Gu1llaum-3 Date: Mon, 23 Feb 2026 21:48:41 +0100 Subject: [PATCH] fix: replace sshm process with ssh via syscall.Exec (issue #41) When running `sshm `, the sshm process was staying alive as a parent for the entire SSH session. History is recorded before SSH starts, so the parent process served no purpose. Use syscall.Exec() to replace the sshm process in-place with ssh, keeping the same PID. Falls back to exec.Command() on Windows where syscall.Exec is not supported. --- cmd/root.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cmd/root.go b/cmd/root.go index 896c616..1dbf66a 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -196,6 +196,15 @@ func connectToHost(hostName string, remoteCommand []string) { fmt.Printf("Connecting to %s...\n", hostName) } + sshPath, lookErr := exec.LookPath("ssh") + if lookErr == nil { + argv := append([]string{"ssh"}, args...) + // On Unix, Exec replaces the process and never returns on success. + // On Windows, Exec is not supported and returns an error; fall through to the exec.Command fallback. + _ = syscall.Exec(sshPath, argv, os.Environ()) + } + + // Fallback for Windows or if LookPath failed sshCmd := exec.Command("ssh", args...) sshCmd.Stdin = os.Stdin sshCmd.Stdout = os.Stdout