1
1
mirror of https://github.com/wez/wezterm.git synced 2024-12-23 05:12:40 +03:00

improve ssh domain support for ssh_config

This tidies up how we pass the ssh config to the connection ui
logic, by moving the ssh_config setup to the two callers.

A couple of notable adjustments:

* SshDomain::username is now optional; it will default to the
  values computed by the ssh config file loader
* no_agent_auth value wasn't hooked up to anything, but now it is

refs: https://github.com/wez/wezterm/issues/730
This commit is contained in:
Wez Furlong 2021-04-24 21:56:32 -07:00
parent 2c89e47f9e
commit 053cb11e9f
4 changed files with 54 additions and 31 deletions

View File

@ -16,7 +16,7 @@ pub struct SshDomain {
pub no_agent_auth: bool,
/// The username to use for authenticating with the remote host
pub username: String,
pub username: Option<String>,
/// If true, connect to this domain automatically at startup
#[serde(default)]

View File

@ -52,33 +52,14 @@ impl LineEditorHost for PasswordPromptHost {
}
pub fn ssh_connect_with_ui(
remote_address: &str,
username: Option<&str>,
ssh_config: wezterm_ssh::ConfigMap,
ui: &mut ConnectionUI,
) -> anyhow::Result<Session> {
let cloned_ui = ui.clone();
cloned_ui.run_and_log_error(move || {
let mut ssh_config = wezterm_ssh::Config::new();
ssh_config.add_default_config_files();
let (remote_host_name, port) = {
let parts: Vec<&str> = remote_address.split(':').collect();
if parts.len() == 2 {
(parts[0], Some(parts[1].parse::<u16>()?))
} else {
(remote_address, None)
}
};
let mut ssh_config = ssh_config.for_host(&remote_host_name);
if let Some(username) = username {
ssh_config.insert("user".to_string(), username.to_string());
}
if let Some(port) = port {
ssh_config.insert("port".to_string(), port.to_string());
}
let remote_address = ssh_config
.get("hostname")
.expect("ssh config to always set hostname");
ui.output_str(&format!("Connecting to {} using SSH\n", remote_address));
let (session, events) = Session::connect(ssh_config.clone())?;

View File

@ -427,7 +427,31 @@ impl Reconnectable {
initial: bool,
ui: &mut ConnectionUI,
) -> anyhow::Result<()> {
let sess = ssh_connect_with_ui(&ssh_dom.remote_address, Some(&ssh_dom.username), ui)?;
let mut ssh_config = wezterm_ssh::Config::new();
ssh_config.add_default_config_files();
let (remote_host_name, port) = {
let parts: Vec<&str> = ssh_dom.remote_address.split(':').collect();
if parts.len() == 2 {
(parts[0], Some(parts[1].parse::<u16>()?))
} else {
(ssh_dom.remote_address.as_str(), None)
}
};
let mut ssh_config = ssh_config.for_host(&remote_host_name);
if let Some(username) = &ssh_dom.username {
ssh_config.insert("user".to_string(), username.to_string());
}
if let Some(port) = port {
ssh_config.insert("port".to_string(), port.to_string());
}
if ssh_dom.no_agent_auth {
ssh_config.insert("identitiesonly".to_string(), "yes".to_string());
}
let sess = ssh_connect_with_ui(ssh_config, ui)?;
let proxy_bin = Self::wezterm_bin_path(&ssh_dom.remote_wezterm_path);
let cmd = if initial {
@ -579,11 +603,25 @@ impl Reconnectable {
if let Some(Ok(ssh_params)) = tls_client.ssh_parameters() {
if self.tls_creds.is_none() {
// We need to bootstrap via an ssh session
let sess = ssh_connect_with_ui(
&ssh_params.host_and_port,
ssh_params.username.as_ref().map(|s| s.as_str()),
ui,
)?;
let mut ssh_config = wezterm_ssh::Config::new();
ssh_config.add_default_config_files();
let mut fields = ssh_params.host_and_port.split(':');
let host = fields
.next()
.ok_or_else(|| anyhow::anyhow!("no host component somehow"))?;
let port = fields.next();
let mut ssh_config = ssh_config.for_host(host);
if let Some(username) = &ssh_params.username {
ssh_config.insert("user".to_string(), username.to_string());
}
if let Some(port) = port {
ssh_config.insert("port".to_string(), port.to_string());
}
let sess = ssh_connect_with_ui(ssh_config, ui)?;
let creds = ui.run_and_log_error(|| {
// The `tlscreds` command will start the server if needed and then

View File

@ -129,7 +129,11 @@ impl ClientDomainConfig {
ClientDomainConfig::Unix(unix) => format!("unix mux {}", unix.socket_path().display()),
ClientDomainConfig::Tls(tls) => format!("TLS mux {}", tls.remote_address),
ClientDomainConfig::Ssh(ssh) => {
format!("SSH mux {}@{}", ssh.username, ssh.remote_address)
if let Some(user) = &ssh.username {
format!("SSH mux {}@{}", user, ssh.remote_address)
} else {
format!("SSH mux {}", ssh.remote_address)
}
}
}
}