WezTerm SSH Domain 完整配置指南:远程多路复用、本地回显与 Shell 集成
【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by @wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/wezterm
SSH Domain 是 WezTerm 中通过 SSH 通道连接远程 WezTerm 多路复用器(multiplexer)的机制,也是实现跨机器共享终端会话、远程 pane/tab 管理、wezterm connect连接的核心配置对象。本文基于docs/config/lua/SshDomain.md及仓库源码(config/src/ssh.rs、mux/src/ssh.rs、wezterm-client/src/domain.rs),系统讲解SshDomain的全部字段、两种multiplexing模式、assume_shell远程 Shell 方言、预测性本地回显阈值,以及 SSH 域与default_domain的配合用法,读完即可写出可落地的远程终端连接配置。
SshDomain 是什么
在 WezTerm 的多路复用体系中,Multiplexing 围绕multiplexing domains(多路复用域)展开:域是一组独立的窗口与标签页集合。SSH Domain 特指经由 SSH 连接访问远程 WezTerm 多路复用器的域,其中 SSH 仅作为承载通道。
SshDomain是描述单个 SSH Domain 的 Lua 对象,它告诉 WezTerm:
- 要连接哪台远程主机(
remote_address); - 以什么身份认证(
username、no_agent_auth); - 连接后如何使用远程能力(
multiplexing、remote_wezterm_path); - 延迟与响应相关的行为(
timeout、local_echo_threshold_ms、overlay_lag_indicator)。
在源码层面,它对应 config/src/ssh.rs 中经wezterm_dynamic派生序列化的SshDomain结构体,并通过impl_lua_conversion_dynamic!宏与 Lua 配置双向转换,因此你在.wezterm.lua中写下的每个字段都会被严格校验后落入该结构体。
基础字段与最小可用配置
SshDomain的核心字段及默认行为如下:
config.ssh_domains = { { -- 该域的唯一名称,必须与配置文件中所有类型的域(含 unix/tls 域)不重名 name = 'my.server', -- 远程服务器的主机:端口 -- 可以是 DNS 名或 IP 地址,末尾可带 ":port" remote_address = '192.168.1.1', -- 是否禁用 agent 认证(SSH Agent Forwarding) -- 设为 true 则禁用;默认 false 即启用 agent 认证 -- no_agent_auth = false, -- 连接远程主机时使用的用户名 username = 'yourusername', -- 若为 true,WeZTerm 启动时自动连接该域 -- connect_automatically = true, -- 自定义读取超时时间(秒),默认 60 秒 -- timeout = 60, -- 远程主机上 wezterm 可执行文件的路径 -- 主要用于 wezterm 未安装在 ssh 会话的 $PATH 中时 -- remote_wezterm_path = "/home/yourusername/bin/wezterm" }, }以上注释字段均有源码佐证:name字段带validate = "validate_domain_name"校验(见 config/src/ssh.rs),remote_address会被 mux/src/ssh.rs 的ssh_domain_to_ssh_config()按冒号拆分为主机与端口分别写入 SSH 配置;timeout的默认值由default_read_timeout()提供,固定为 60 秒(见 config/src/config.rs)。
最小配置与连接命令
在docs/multiplexing.md中给出了等价的最小示例:只需name、remote_address、username三项即可。配置完成后,通过以下命令连接该域:
$ wezterm connect my.server该命令会发起 SSH 会话,连接后远程拉起 wezterm 多路复用器守护进程,并通过类 Unix 域套接字机制完成挂接;认证阶段可能弹出交互对话框(文档强烈建议使用 SSH 密钥认证)。
自动填充自 ~/.ssh/config
自20230408-112425-69ae8472起,SSH 域会自动从~/.ssh/config填充:每个主机都会生成普通 SSH 域(前缀SSH:)与多路复用 SSH 域(前缀SSHMUX:)各一个。例如:
$ wezterm connect SSHMUX:my.server # 或在已有 WezTerm GUI 实例的新标签页中创建: $ wezterm cli spawn --domain-name SSHMUX:my.server该行为由SshDomain::default_domains()实现:它读取~/.ssh/config并enumerate_hosts()逐个生成SSH:{host}(multiplexing = None)与SSHMUX:{host}(multiplexing = WezTerm)两类域(见 config/src/ssh.rs)。若需自定义该逻辑,可参考 wezterm.default_ssh_domains()。
ssh_option:向底层 SSH 配置注入参数
自20220101-133340-7edc5b5a起,SshDomain支持通过ssh_option表直接覆写底层 SSH 配置项:
config.ssh_domains = { { name = 'my.server', remote_address = '192.168.1.1', ssh_option = { identityfile = '/path/to/id_rsa', }, }, }从实现看,ssh_option是HashMap<String, String>(见 config/src/ssh.rs),ssh_domain_to_ssh_config()会先解析~/.ssh/config,再逐个将表项写入最终生效的配置 Map,因此可以用它覆盖 ssh 配置文件中的任意选项。该函数还揭示了其他字段的底层映射关系:
remote_address中的:port→port配置项;username→user配置项;no_agent_auth = true→ 写入identitiesonly = yes(禁用 agent 认证的底层实现);ssh_backend→ 写入wezterm_ssh_backend = "ssh2" | "libssh",支持SshBackend::Ssh2与SshBackend::LibSsh两种后端(默认LibSsh)。
config.ssh_domains = { { name = 'my.server', remote_address = '192.168.1.1', -- 显式指定底层 SSH 后端:'Ssh2' 或 'LibSsh' ssh_backend = 'Ssh2', }, }multiplexing:复用模式与免安装直连模式
自20220319-142410-0fcdea07起,可通过multiplexing指定 SSH 域的多路复用类型,可选值在SshMultiplexing枚举中定义(见 config/src/ssh.rs):
"WezTerm"(默认):使用 WezTerm 自己的多路复用客户端。此模式要求远程服务器上安装有 WezTerm,连接后可获得与本地一致的标签、分屏与回滚体验。"None":不使用任何多路复用,仅是一条与wezterm ssh机制相同的 SSH 连接;断连即丢失全部 pane/tab。此模式不要求远程安装 WezTerm,特别适合与 default_domain 配合,让 SSH 自动连接进入如本地 WSL 实例等场景。
assume_shell:让远程 Shell 集成生效
当multiplexing = "None"时,配合assume_shell选项可让 WezTerm 假定远程主机使用的 Shell 命令语言方言,从而在新建 pane/tab 时尊重远程主机上由 Shell Integration(OSC 7)设置的工作目录。可选值定义于Shell枚举:
"Unknown"(默认):不假定远程 Shell,无法做任何假设。"Posix":远程为 POSIX/Bourne Shell 兼容环境,支持env -c DIR ENV1=VAL1 ENV2=VAL2 CMD与env -c DIR ENV1=VAL1 ENV2=VAL2 $SHELL语法。
完整的组合示例(配合default_prog与default_domain):
config.ssh_domains = { { name = 'my.server', remote_address = '192.168.1.1', multiplexing = 'None', -- 当 multiplexing == "None" 时,default_prog 用于指定 -- 新标签页/分屏中的默认程序。 -- 注意:由于 ssh 的工作方式,无法直接指定 default_cwd, -- 但可以改变 default_prog 来进入特定目录。 default_prog = { 'fish' }, -- 假定可远程使用如下语法: -- "env -C /some/where $SHELL" -- 即使用远程主机上的默认命令 Shell, -- 使 Shell 集成尊重远程主机上的当前目录。 assume_shell = 'Posix', }, } config.default_domain = 'my.server'从实现看,assume_shell = 'Posix'会在build_command()中走build_env_command()路径(见 mux/src/ssh.rs):它把 pane 的环境变量、cd目录前缀与命令拼接成一行env VAR=x CMD形式的远程命令;若命令是默认程序,还会借助perl/exec -a等可移植手段以 login shell 方式启动$SHELL,从而保证远程目录感知正常工作。
预测性本地回显:local_echo_threshold_ms
local_echo_threshold_ms用于设置启用预测性本地回显(predictive local echo)的往返延迟阈值:当 WeZTerm 客户端与服务器之间测得的往返延迟超过该阈值时,客户端会尝试预测服务器对按键事件的响应,并不等待服务器确认就在本地回显预测结果,从而对用户隐藏高延迟。该选项仅适用于multiplexing = "WezTerm"。
config.ssh_domains = { { name = 'my.server', remote_address = '192.168.1.1', local_echo_threshold_ms = 10, }, }单位是毫秒,默认值为Some(100)(即 100ms,见 config/src/config.rs 的default_local_echo_threshold_ms())。从源码看,该阈值在客户端完成域挂接时被读取并注入ClientInner(见 wezterm-client/src/domain.rs 的finish_attach()与local_echo_threshold_ms()方法),Unreal/TLS/SSH 三类客户端域共用同一套阈值机制。
延迟指示器:overlay_lag_indicator 与状态栏方案
自20221119-145034-49b9839f起,延迟指示器(lag indicator)默认禁用。官方推荐将延迟信息显示在状态栏中,可参考 get_metadata 中的示例——利用is_tardy与since_last_response_ms字段在update-status事件中渲染:
local wezterm = require 'wezterm' wezterm.on('update-status', function(window, pane) local meta = pane:get_metadata() or {} if meta.is_tardy then local secs = meta.since_last_response_ms / 1000.0 window:set_right_status(string.format('tardy: %5.1fs⏳', secs)) end end) return {}其中is_tardy仅在多路复用客户端 pane 中填充,表示 WeZTerm 正在等待服务器响应;since_last_response_ms表示距最近一次服务器响应经过的毫秒数。
如果你仍希望把延迟信息叠加在内容区域上,可设置:
config.ssh_domains = { { name = 'my.server', remote_address = '192.168.1.1', overlay_lag_indicator = true, }, }但请注意,文档明确表示作者计划在将来移除overlay_lag_indicator功能,因此新配置应优先采用状态栏方案。该字段同样在finish_attach()时随阈值一并注入客户端(见 wezterm-client/src/domain.rs)。
字段速查表
| 字段 | 类型/取值 | 默认值 | 说明 |
|---|---|---|---|
name | 字符串 | 必填 | 域名,须在所有类型域中唯一 |
remote_address | 字符串 | 必填 | 主机名/IP,可带:port |
username | 字符串 | 无 | 远程认证用户名,映射为 SSHuser |
no_agent_auth | 布尔 | false | 禁用 agent 认证,映射为identitiesonly=yes |
connect_automatically | 布尔 | false | 启动时自动连接该域 |
timeout | 秒 | 60 | 读取超时时间 |
remote_wezterm_path | 字符串 | 无 | 远程 wezterm 可执行文件路径 |
override_proxy_command | 字符串 | 无 | 完全覆写wezterm cli proxy调用 |
ssh_backend | Ssh2/LibSsh | LibSsh | 底层 SSH 后端 |
ssh_option | 表 | 空 | 覆写任意底层 SSH 配置项 |
multiplexing | WezTerm/None | WezTerm | 多路复用模式 |
default_prog | 字符串数组 | 无 | 新 pane/tab 的默认程序(None模式可用) |
assume_shell | Unknown/Posix | Unknown | 远程 Shell 方言假设 |
local_echo_threshold_ms | 毫秒 | 100 | 启用预测性本地回显的延迟阈值 |
overlay_lag_indicator | 布尔 | false | 内容区叠加延迟指示(计划移除) |
注:
override_proxy_command、ssh_backend等在 config/src/ssh.rs 结构体中同样存在;connect_automatically在文档中提及,而docs/multiplexing.md更推荐使用default_gui_startup_args = { 'connect', 'my.server' }方式实现启动连接,因为它工作更可靠。
典型落地场景
场景一:远程多路复用工作区(远程需安装 WezTerm)。配置multiplexing = "WezTerm"(默认),随后用wezterm connect my.server挂接远程会话,配合快捷键CTRL+SHIFT+2等可在域间创建新标签,实现类似 tmux 的跨机持久会话。
场景二:SSH 直连 WSL / 免安装主机。设置multiplexing = "None"加assume_shell = "Posix",再通过config.default_domain = 'my.server'让 WezTerm 启动即进入该 SSH 域,兼顾免装远程 wezterm 与远程目录跟随能力。
场景三:高延迟链路优化。在跨国或弱网环境下,将local_echo_threshold_ms调低(如10),让本地回显尽早生效;同时在状态栏用get_metadata展示since_last_response_ms以便观测链路质量。
以上配置均写入用户自己的.wezterm.lua文件(通常位于~/.wezterm.lua),完成后重启 WezTerm 或使用配置重载即可生效。
【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by @wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/wezterm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考