zed-industries/zed · error
ssh process exited before connection established
Error message
ssh process exited before connection established
What it means
On the Windows connect path, wait_connected reads ssh's stdout line by line until the ZED_SSH_CONNECTION_ESTABLISHED magic appears; read_line returning 0 bytes is EOF, meaning the ssh master process exited before it ever printed the marker, so connection establishment cannot complete.
Source
Thrown at crates/remote/src/transport/ssh.rs:279
Ok(MasterProcess { process })
}
pub async fn wait_connected(&mut self) -> Result<()> {
use smol::io::AsyncBufReadExt;
let Some(stdout) = self.process.stdout.take() else {
anyhow::bail!("ssh process stdout capture failed");
};
let mut reader = smol::io::BufReader::new(stdout);
let mut line = String::new();
loop {
let n = reader.read_line(&mut line).await?;
if n == 0 {
anyhow::bail!("ssh process exited before connection established");
}
if line.contains(Self::CONNECTION_ESTABLISHED_MAGIC) {
return Ok(());
}
}
}
}
impl AsRef<Child> for MasterProcess {
fn as_ref(&self) -> &Child {
&self.process
}
}
impl AsMut<Child> for MasterProcess {
fn as_mut(&mut self) -> &mut Child {
&mut self.processView on GitHub (pinned to f4178619ac)
Solutions
- Run the equivalent command manually to see why ssh exits: `ssh -vvv <user>@<host>` in a terminal
- Fix user/port/credentials in Zed's remote connection options
- Install or repair the OpenSSH client (Windows Settings > Apps > Optional Features > OpenSSH Client) and confirm `where ssh` resolves it
- Pre-accept the host key: `ssh-keyscan <host> >> known_hosts`, or pass StrictHostKeyChecking=accept-new via additional ssh args
Example fix
# before: OpenSSH client missing on Windows, ssh exits instantly where ssh # not found # after (PowerShell, admin) Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0 # reconnect from Zed
Defensive patterns
Strategy: try-catch
Validate before calling
// Preflight from a terminal: a zero exit means ssh gets far enough to establish // ssh -o BatchMode=yes -o ConnectTimeout=5 -T <user>@<host> true; echo $?
Try / catch
match master.wait_connected().await {
Err(e) if e.to_string().contains("exited before connection established") => {
// run `ssh -vvv user@host` manually and surface the real cause (auth/host/network)
Err(e)
}
other => other,
} Prevention
- Pre-accept host keys with ssh-keyscan to avoid prompt-then-exit
- Verify the OpenSSH client is installed and first on PATH on Windows
- Validate user/port and key loading before automating connections
When it happens
Trigger: The ssh.exe master process terminates during the handshake: authentication failure, unreachable host, bad port/user, malformed ssh arguments, or ssh.exe missing from PATH so the spawn target fails immediately.
Common situations: Windows machines without the OpenSSH client optional feature installed; wrong username/port in the remote connection options; host key prompts hitting a non-interactive channel; mistyped or stale connection settings.
Related errors
- failed to connect: {}
- connecting to host timed out
- Device lost: {err}
- build ids may only contain lowercase letters, numbers, '.',
- unknown judge preset '{name}' (valid: {valid})
AI-assisted analysis of zed-industries/zed@f4178619ac (2026-08-20).
Data as JSON: /api/errors/eaccf3066ab95bc2.
Report an issue: GitHub.