diff --git a/crates/remote/src/transport/ssh.rs b/crates/remote/src/transport/ssh.rs index cb95aaea507671ec655f731fc48b6d79a856e17e..d18b46b3d011c857023c0f091730ea10014c931a 100644 --- a/crates/remote/src/transport/ssh.rs +++ b/crates/remote/src/transport/ssh.rs @@ -1026,7 +1026,7 @@ fn build_command( ) -> Result { use std::fmt::Write as _; - let mut exec = String::from("exec env -C "); + let mut exec = String::new(); if let Some(working_dir) = working_dir { let working_dir = RemotePathBuf::new(working_dir, ssh_path_style).to_string(); @@ -1035,13 +1035,14 @@ fn build_command( const TILDE_PREFIX: &'static str = "~/"; if working_dir.starts_with(TILDE_PREFIX) { let working_dir = working_dir.trim_start_matches("~").trim_start_matches("/"); - write!(exec, "\"$HOME/{working_dir}\" ",).unwrap(); + write!(exec, "cd \"$HOME/{working_dir}\" && ",).unwrap(); } else { - write!(exec, "\"{working_dir}\" ",).unwrap(); + write!(exec, "cd \"{working_dir}\" && ",).unwrap(); } } else { - write!(exec, "\"$HOME\" ").unwrap(); + write!(exec, "cd && ").unwrap(); }; + write!(exec, "exec env ").unwrap(); for (k, v) in input_env.iter() { if let Some((k, v)) = shlex::try_quote(k).ok().zip(shlex::try_quote(v).ok()) { @@ -1106,7 +1107,7 @@ mod tests { "-p", "2222", "-t", - "exec env -C \"$HOME/work\" INPUT_VA=val remote_program arg1 arg2" + "cd \"$HOME/work\" && exec env INPUT_VA=val remote_program arg1 arg2" ] ); assert_eq!(command.env, env); @@ -1137,7 +1138,7 @@ mod tests { "-L", "1:foo:2", "-t", - "exec env -C \"$HOME\" INPUT_VA=val /bin/fish -l" + "cd && exec env INPUT_VA=val /bin/fish -l" ] ); assert_eq!(command.env, env);