远程 Shell 方案

基于 Tailscale 组网和 zmx 会话持久化的远程开发方案,保留原生终端体验。

远程 Shell 方案

概览

项目 说明
本地 MacBook M4 Pro 24GB, Ghostty 终端, fish shell
远程 14900K 48GB 分体水冷黑苹果 (Intel), fish shell, host 别名 rog
网络 Tailscale 组网
会话持久 zmx(只做持久化,不劫持终端,剪贴板/滚动/终端特性全部原生)
偶尔 GUI Todesk / UU 远程桌面
iOS 访问 Termius → SSH 后手动 zmx attach mobile

为什么选 zmx 而不是 tmux

  • 窗口管理交给 Ghostty,zmx 只做会话持久化,职责清晰
  • 剪贴板、滚动回看、鼠标选中全部原生,不需要 OSC52 hack
  • 使用 libghostty-vt 做终端状态恢复,和 Ghostty 同源
  • 不劫持终端渲染,所有终端特性(图片、链接等)完全透传

一、本地 MacBook 配置

1. SSH 配置

mkdir -p ~/.ssh/sockets

编辑 ~/.ssh/config

# 基础连接(普通 shell,不自动进 zmx)
Host rog
    HostName 100.x.x.x          # 远程机 Tailscale IP
    User your-username
    ServerAliveInterval 15
    ServerAliveCountMax 3
    Compression yes
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h-%p
    ControlPersist 600

# zmx session 快捷入口
Host rog-*
    HostName 100.x.x.x
    User your-username
    ServerAliveInterval 15
    ServerAliveCountMax 3
    Compression yes
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h-%p
    ControlPersist 600
    RequestTTY yes
    RemoteCommand zmx attach %n
%n 展开为 SSH host 别名(如 rog-work),zmx 用它作为 session 名ControlMaster:多个 SSH 连接复用同一 TCP 通道,第二个窗口秒连ControlPersist 600:最后一个连接关闭后保持 10 分钟

2. 免密登录

# 生成密钥(已有则跳过)
ssh-keygen -t ed25519

# 传公钥到远程机
ssh-copy-id rog

3. 同步 Ghostty terminfo

infocmp -x xterm-ghostty | ssh rog tic -x -
如出现 older tic versions may treat the description field as an alias 警告可忽略。

备选:如 terminfo 同步有问题,在 ~/.ssh/config 的 Host 中添加:

    SetEnv TERM=xterm-256color

二、远程黑苹果配置

ssh rog

1. 安装 zmx 和 btop

brew tap neurosnap/tap
brew install zmx btop

2. Fish 通用标题配置

编辑 ~/.config/fish/config.fish(本地和远程都加同一份):

function fish_title
    set -l prefix ""
    if set -q ZMX_SESSION
        set prefix "[$ZMX_SESSION] "
    else if set -q SSH_CONNECTION
        set prefix "["(hostname -s)"] "
    end
    echo $prefix(string join " — " (string match -r '.+' $argv) (prompt_pwd))
end
效果:本地空闲 → ~/projects本地跑 btop → btop — ~/projectszmx session 空闲 → [rog-work] ~/codezmx session 跑 btop → [rog-work] btop — ~/code普通 SSH(无 zmx) → [rog] ~/code

3. btop

brew install btop

无需额外配置,14900K 的 P-Core / E-Core 分别显示。 配置文件:~/.config/btop/btop.conf(运行一次后自动生成)。


三、日常使用

连接

在不同的 Ghostty 窗口中分别执行:

ssh rog-work     # → zmx attach rog-work(工作)
ssh rog-btop     # → zmx attach rog-btop(监控)
ssh rog-code     # → zmx attach rog-code(编码)

名字随意起,首次连接自动创建 session。

普通 SSH(不进 zmx):

ssh rog          # 临时用一下

断线恢复

关掉 Ghostty、合盖、断网均不影响远程 zmx session。重新打开 Ghostty 窗口,再次 ssh rog-work 即可恢复完整终端状态。

Session 管理

ssh rog
zmx ls                # 列出所有活跃 session
zmx kill rog-btop     # 销毁某个 session

Detach

  • Ctrl+\ — detach 当前 session(保持后台运行)
  • 直接关闭 Ghostty 窗口也可以,session 不会被杀

iOS (Termius)

  1. 新建 Host → 填入 Tailscale IP、用户名
  2. SSH 连上后手动执行 zmx attach mobile
  3. 断线重连后再次 zmx attach mobile 恢复

四、推荐布局

Ghostty 窗口 1          Ghostty 窗口 2
┌──────────────────┐   ┌──────────────────┐
│                  │   │                  │
│  ssh rog-work    │   │  ssh rog-btop    │
│  工作区域         │   │  btop 监控       │
│                  │   │                  │
└──────────────────┘   └──────────────────┘

每个窗口独立 SSH、独立 zmx session,互不干扰。 Ghostty 标题栏自动显示 [rog-work] ~/code[rog-btop] btop — ~