diff --git a/Cargo.lock b/Cargo.lock index 0c4ea47526..ff5d7540d9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9986,6 +9986,7 @@ dependencies = [ "tempfile", "thiserror", "util", + "which 6.0.3", ] [[package]] diff --git a/crates/remote/Cargo.toml b/crates/remote/Cargo.toml index 8a199c56f6..69d1d97c59 100644 --- a/crates/remote/Cargo.toml +++ b/crates/remote/Cargo.toml @@ -38,6 +38,7 @@ tempfile.workspace = true thiserror.workspace = true util.workspace = true release_channel.workspace = true +which.workspace = true [dev-dependencies] gpui = { workspace = true, features = ["test-support"] } diff --git a/crates/remote/src/ssh_session.rs b/crates/remote/src/ssh_session.rs index c607f0a0ec..20795be201 100644 --- a/crates/remote/src/ssh_session.rs +++ b/crates/remote/src/ssh_session.rs @@ -1428,9 +1428,21 @@ impl SshRemoteConnection { } }); + anyhow::ensure!( + which::which("nc").is_ok(), + "Cannot find nc, which is required to connect over ssh." + ); + // Create an askpass script that communicates back to this process. let askpass_script = format!( - "{shebang}\n{print_args} | nc -U {askpass_socket} 2> /dev/null \n", + "{shebang}\n{print_args} | {nc} -U {askpass_socket} 2> /dev/null \n", + // on macOS `brew install netcat` provides the GNU netcat implementation + // which does not support -U. + nc = if cfg!(target_os = "macos") { + "/usr/bin/nc" + } else { + "nc" + }, askpass_socket = askpass_socket.display(), print_args = "printf '%s\\0' \"$@\"", shebang = "#!/bin/sh",