Skip to content

Commit a47093a

Browse files
committed
ssh kitten: Fix -o RemoteCommand handling
1 parent a9e56d5 commit a47093a

2 files changed

Lines changed: 11 additions & 11 deletions

File tree

kittens/ssh/main.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -630,14 +630,17 @@ func run_ssh(ssh_args, server_args, found_extra_args []string, ssh_config_channe
630630
_ = data_shm.Unlink()
631631
}
632632
}()
633-
cmd := append([]string{SSHExe()}, ssh_args...)
633+
// In ssh CLI parsing first -o wins
634+
cmd := []string{SSHExe(), "-o", "RemoteCommand=none"}
635+
cmd = append(cmd, ssh_args...)
634636
cd := connection_data{remote_args: server_args[1:]}
635637
hostname := server_args[0]
636638
if len(cd.remote_args) == 0 {
637639
cmd = append(cmd, "-t")
638640
}
639641
insertion_point := len(cmd)
640642
cmd = append(cmd, "--", hostname)
643+
cmd = slices.Insert(cmd, insertion_point, "-o", "RemoteCommand=none")
641644
uname, hostname_for_match := get_destination(hostname)
642645
overrides, literal_env, err := parse_kitten_args(found_extra_args, uname, hostname_for_match)
643646
if err != nil {
@@ -779,11 +782,7 @@ func run_ssh(ssh_args, server_args, found_extra_args []string, ssh_config_channe
779782
}
780783
defer cleanup()
781784
// Receive ssh config
782-
ssh_config := <-ssh_config_channel
783-
if ssh_config != nil && ssh_config.RemoteCommand != "" {
784-
cmd = slices.Insert(cmd, insertion_point, "-o", "RemoteCommand=none")
785-
}
786-
cd.ssh_config = ssh_config
785+
cd.ssh_config = <-ssh_config_channel
787786
err = get_remote_command(&cd)
788787
if err != nil {
789788
return 1, err
@@ -820,8 +819,7 @@ func run_ssh(ssh_args, server_args, found_extra_args []string, ssh_config_channe
820819
err = c.Wait()
821820
drain_potential_tty_garbage(term)
822821
if err != nil {
823-
var exit_err *exec.ExitError
824-
if errors.As(err, &exit_err) {
822+
if exit_err, ok := errors.AsType[*exec.ExitError](err); ok {
825823
if state := exit_err.ProcessState.String(); state == "signal: interrupt" {
826824
cleanup()
827825
_ = unix.Kill(os.Getpid(), unix.SIGINT)
@@ -863,7 +861,7 @@ func main(cmd *cli.Command, o *Options, args []string) (rc int, err error) {
863861

864862
ctx, cancel := context.WithCancel(context.Background())
865863
defer cancel()
866-
ssh_config_channel := ReadSSHConfig(ctx, server_args[0])
864+
ssh_config_channel := ReadSSHConfig(ctx, ssh_args, server_args[0])
867865

868866
if os.Getenv("KITTY_WINDOW_ID") == "" || os.Getenv("KITTY_PID") == "" {
869867
return 1, fmt.Errorf("The SSH kitten is meant to run inside a kitty window")

kittens/ssh/utils.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,13 +201,15 @@ type SSHConfig struct {
201201
}
202202

203203
// ReadSSHConfig Asynchronously read ssh configuration
204-
func ReadSSHConfig(ctx context.Context, hostname string) <-chan *SSHConfig {
204+
func ReadSSHConfig(ctx context.Context, ssh_args []string, hostname string) <-chan *SSHConfig {
205205
ch := make(chan *SSHConfig, 1)
206206

207207
go func() {
208208
defer close(ch)
209209

210-
cmd_args := []string{SSHExe(), hostname, "-G"}
210+
cmd_args := []string{SSHExe(), "-G"}
211+
cmd_args = append(cmd_args, ssh_args...)
212+
cmd_args = append(cmd_args, hostname)
211213
cmd := exec.CommandContext(ctx, cmd_args[0], cmd_args[1:]...)
212214
var stdout, stderr bytes.Buffer
213215
cmd.Stdout = &stdout

0 commit comments

Comments
 (0)