ssh: Use openbsd nc on macOS (#20751)

Peter Tripp and Conrad Irwin created

Co-authored-by: Conrad Irwin <conrad@zed.dev>

Change summary

Cargo.lock                       |  1 +
crates/remote/Cargo.toml         |  1 +
crates/remote/src/ssh_session.rs | 14 +++++++++++++-
3 files changed, 15 insertions(+), 1 deletion(-)

Detailed changes

Cargo.lock 🔗

@@ -9986,6 +9986,7 @@ dependencies = [
  "tempfile",
  "thiserror",
  "util",
+ "which 6.0.3",
 ]
 
 [[package]]

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"] }

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",