ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

WezTerm `ssh_domains` 配置完全指南:基于 SSH 的远程多路复用域详解

WezTerm `ssh_domains` 配置完全指南:基于 SSH 的远程多路复用域详解 WezTermssh_domains配置完全指南基于 SSH 的远程多路复用域详解【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/weztermssh_domains是 WezTerm 配置中用于定义SSH 多路复用域SSH Domain的核心选项。通过它你可以让 WezTerm 经由 SSH 通道连接远程主机上的 wezterm 多路复用守护进程将远程的标签页、窗格挂载到本地图形界面中享受完整的鼠标、剪贴板与回滚交互体验并在网络中断后恢复会话。读完本文你将掌握ssh_domains的全部字段语义、multiplexing两种模式的取舍、从~/.ssh/config自动生成域的方法以及底层实现如何把这些配置翻译成真实的 SSH 连接参数。SSH Domain 是什么在 WezTerm 中多路复用multiplexing围绕多路复用域domain这一概念组织域是一组窗口和标签页的集合。WezTerm 启动时会创建一个默认的本地域来管理 UI 中的窗口与标签页同时也可以配置为启动或连接额外的域。一旦连上某个域WezTerm 就会把该域下的窗口与标签页挂载到本地原生 UI 上从而获得更自然的鼠标、剪贴板与回滚交互体验。所谓SSH Domain就是经由 SSH 连接建立到远程 wezterm 多路复用器的连接。需要特别强调的是远程系统上必须安装兼容版本的 wezterm 才能使用 SSH 域的多路复用模式multiplexing WezTerm。SSH 域通过内嵌的 SSH 库在所有平台上受支持。这一点与wezterm ssh提供的临时 SSH 连接不同——后者不要求远端安装 wezterm但会话不持久网络断开即丢失所有标签页。基础配置声明一个 SSH Domainssh_domains接受一个 SshDomain 对象的列表。把它写进.wezterm.luaconfig.ssh_domains { { -- 该域的唯一标识必须在配置文件中所有类型的域中保持唯一 name my.server, -- 远程服务器的主机:端口 -- 可以是 DNS 名或 IP 地址末尾可带 :port remote_address 192.168.1.1, -- 用于远程认证的用户名 username wez, }, }配置完成后用下面命令连接该域$ wezterm connect my.server命令会启动一个 SSH 会话连接指定地址并可能弹出认证对话框强烈建议使用 SSH 密钥认证。连接成功后WezTerm 会在远程主机上拉起 wezterm 多路复用守护进程并通过 unix domain socket 连接它——这与 Unix Domains 的连接机制类似。也可以把某个 SSH 域设为默认启动域。例如结合multiplexing None和 default_domain 配置可用于自动连接本地的 WSL 实例config.ssh_domains { { name my.server, remote_address 192.168.1.1, multiplexing None, default_prog { fish }, assume_shell Posix, }, } config.default_domain my.server字段全解析与默认值以下字段均可在SshDomain对象中设置。从 SshDomain 的 Rust 实现 可以看到每个字段的完整定义与默认行为字段类型默认值说明namestring必填域名称必须在所有域中唯一且需通过validate_domain_name校验remote_addressstring必填远程主机地址支持 DNS 名或 IP 可选:portusernamestring无认证使用的用户名no_agent_authbooleanfalse设为true禁用 agent 认证connect_automaticallybooleanfalse设为true时启动自动连接该域timeoutnumber内置默认读超时替代性的读超时时间local_echo_threshold_msnumber内置默认阈值预测性本地回显的往返延迟阈值仅multiplexing WezTerm时生效overlay_lag_indicatorbooleanfalse等待响应时在内容区叠加显示延迟指示器推荐改用状态栏方案remote_wezterm_pathstring无远程主机上 wezterm 二进制路径用于未在 ssh 的$PATH中时override_proxy_commandstring无覆盖整个wezterm cli proxy调用ssh_backendstring无回退全局配置Ssh2libssh2或LibSshlibsshmultiplexingstringWezTerm多路复用模式见下文ssh_optiontable空覆盖 ssh 配置项如identityfiledefault_progarray无新标签页/窗格中的默认程序仅multiplexing None时可用assume_shellstringUnknown假设远端 shell 方言见下文一个包含全部常用注释的完整示例摘自 SshDomain 文档config.ssh_domains { { name my.server, remote_address 192.168.1.1, -- no_agent_auth false, username yourusername, -- connect_automatically true, -- timeout 60, -- remote_wezterm_path /home/yourusername/bin/wezterm }, }覆盖 SSH 配置ssh_option从 20220101-133340-7edc5b5a 版本起可以在域中指定一个表来覆盖 SSH 配置项。表中键值会直接写入底层 ssh 库的配置映射config.ssh_domains { { name my.server, remote_address 192.168.1.1, ssh_option { identityfile /path/to/id_rsa, }, }, }在 mux/src/ssh.rs 的ssh_domain_to_ssh_config函数 中可以看到这些配置如何被翻译为实际的 SSH 参数remote_address中的host:port会被拆解并写入hostname/portusername写入userno_agent_auth true时写入identitiesonly yesssh_option中的每个键值对则逐项覆盖进配置映射最终作为wezterm_ssh::ConfigMap传给Session::connect。WezTerm 内嵌 SSH 客户端能够解析~/.ssh/config与/etc/ssh/ssh_config并尊重IdentityAgent、IdentityFile、Hostname、User、Port、ProxyCommand、Host含通配符匹配、UserKnownHostsFile、IdentitiesOnly、BindAddress等选项Match支持有限仅Host与LocalUser的单阶段匹配Include已支持见 docs/ssh.md。multiplexing 模式WezTerm 与 None 的取舍从 20220319-142410-0fcdea07 版本起可为 SSH 域指定multiplexing类型WezTerm默认使用 wezterm 自己的多路复用客户端。要求服务器上安装 wezterm连接具有持久性适合长时间在远程工作的场景。None不使用任何多路复用连接机制与wezterm ssh相同不要求远端安装 wezterm但断网会丢失所有窗格与标签页。当用 SSH 自动接入本地托管的 WSL 等场景时非常方便。在multiplexing None模式下default_prog可用于指定新标签页/窗格的默认程序。由于 SSH 的工作方式无法直接指定default_cwd但可以通过修改default_prog让自己进入特定目录config.ssh_domains { { name my.server, remote_address 192.168.1.1, multiplexing None, default_prog { fish }, }, }assume_shell让远端目录同步生效assume_shell与multiplexing None搭配时允许 WezTerm 假设远端使用某种特定 shell 命令语言方言从而在远程主机上派生新窗格/标签页时尊重由 OSC 7 / Shell Integration 设置的当前工作目录。可取值Unknown默认不对远端 shell 做任何假设。Posix远端为 POSIX/Bourne shell 兼容环境支持env -c DIR ENV1VAL1 ENV2VAL2 CMD与env -c DIR ENV1VAL1 ENV2VAL2 $SHELL这类语法。config.ssh_domains { { name my.server, remote_address 192.168.1.1, multiplexing None, default_prog { fish }, -- 假设可以使用 env -C /some/where $SHELL 这类语法 -- 使 shell integration 尊重远端当前目录 assume_shell Posix, }, }从 mux/src/ssh.rs 的build_command可以印证这一点当assume_shell Shell::Posix时命令会被包装成cd dir; env KV K2V2 cmd的形式其中目录缺失会被视为软 chdir不存在也无妨默认程序还会尝试以登录 shell 方式执行优先用 perl其次exec -a以保证$SHELL以-前缀启动。预测性本地回显local_echo_threshold_ms网络延迟较高时本地输入会明显卡顿。local_echo_threshold_ms用于设置启用预测性本地回显的往返延迟阈值当 WezTerm 客户端与服务器之间的实测往返延迟超过该阈值时客户端会尝试预测服务器对按键事件的响应并不等待地在本地回显从而对用户隐藏延迟。该选项仅在multiplexing WezTerm时生效config.ssh_domains { { name my.server, remote_address 192.168.1.1, local_echo_threshold_ms 10, }, }延迟指示器状态栏优先于叠加层自 20221119-145034-49b9839f 版本起延迟指示器默认禁用。官方推荐在状态栏中通过pane:get_metadata()的since_last_response_ms展示延迟信息参见 pane/get_metadata 文档。如果你更喜欢将信息叠加在内容区可以设置overlay_lag_indicator true但注意该功能未来可能被移除config.ssh_domains { { name my.server, remote_address 192.168.1.1, overlay_lag_indicator true, }, }默认行为与自动填充wezterm.default_ssh_domains()自 20230408-112425-69ae8472 版本起如果你在配置中不设置ssh_domainsWezTerm 会按如下默认值配置config.ssh_domains wezterm.default_ssh_domains()wezterm.default_ssh_domains()会基于~/.ssh/config中发现的主机集合计算 SshDomain 列表。每个主机都会生成两个域一个普通 SSH 域前缀SSH:不要求远端安装 wezterm和一个多路复用 SSH 域前缀SSHMUX:要求远端安装 wezterm。其实现位于 config/src/ssh.rs 的default_domains遍历~/.ssh/config枚举出的主机分别以SSH:{host}和SSHMUX:{host}命名前者multiplexing None后者multiplexing WezTerm并把普通域排在多路复用域之前返回。例如~/.ssh/config中有名为my.server的主机时可直接连接多路复用域$ wezterm connect SSHMUX:my.server # 或在已有 wezterm GUI 实例中新建标签页 $ wezterm cli spawn --domain-name SSHMUX:my.server注意由于解析全部 ssh 配置文件开销较大Config 的ssh_domains()访问器 采用惰性求值——仅在有人显式请求时才生成默认列表。默认域的真正来源是 Lua 模块中注册的wezterm.default_ssh_domains函数见 lua-api-crates/ssh-funcs/src/lib.rs其中还注册了wezterm.enumerate_ssh_hosts()用于枚举 ssh 配置中的主机。default_ssh_domains()的设计目的是给你先拿到再改的机会比如你的 ssh 配置中所有主机都是 Unix 机器可以批量告诉 WezTerm使在与现有标签页相同目录中派生新标签页这一特性即使在普通 SSH 会话下也能工作config.ssh_domains wezterm.default_ssh_domains() for _, dom in ipairs(config.ssh_domains) do dom.assume_shell Posix end更多说明见 wezterm.default_ssh_domains() 文档。底层 SSH 后端ssh_backend每个域还可通过ssh_backend指定 SSH 实现未设置时回退到全局 ssh_backend 配置LibSsh全局默认使用 libssh。对更新的密钥与加密算法支持更广且对需要输入 passphrase 的认证事件有更清晰的反馈。Ssh2使用 libssh2。需要澄清的是尽管命名相似libssh2并非libssh的新版本两者是完全独立的 SSH 实现。在 mux/src/ssh.rs 中所选后端会以wezterm_ssh_backend键写入配置映射值为ssh2或libssh由wezterm_ssh连接层据此选择实现。注意ServerAliveInterval仅由 libssh 后端支持。连接与使用要点连接指定域wezterm connect domain-name。在 GUI 中新开标签页wezterm cli spawn --domain-name domain-name。认证连接时可能出现认证对话框host key 校验、用户名/密码、passphrase 等。从 mux/src/ssh.rs 的connect_ssh_session可以看到WezTerm 会在窗格内就地完成这些交互——通过包装的 pty/子进程将认证过程注入新派生窗格认证成功后无缝切换为真实 pty主机密钥变更时则会显示REMOTE HOST IDENTIFICATION CHANGED等安全警告。持久性多路复用模式默认下连接不因网络抖动而丢失标签页multiplexing None是临时连接断网即丢。小结ssh_domains是 WezTerm 将远程开发工作流原生化的关键配置通过声明式 Lua 配置定义 SSH 多路复用域配合自动从~/.ssh/config生成的SSH:/SSHMUX:域、可选的预测性本地回显、assume_shell远端目录同步以及 libssh/libssh2 双后端支持你可以在本地 GUI 中获得接近本机的远程终端体验。更完整的域体系Unix Domains、TLS Domains可进一步阅读 multiplexing.md 与 ssh.md。【免费下载链接】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),仅供参考
返回列表