远程 Shell 方案
基于 Tailscale 组网和 zmx 会话持久化的远程开发方案,保留原生终端体验。
概览
| 项目 | 说明 |
|---|---|
| 本地 | 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)
- 新建 Host → 填入 Tailscale IP、用户名
- SSH 连上后手动执行
zmx attach mobile - 断线重连后再次
zmx attach mobile恢复
四、推荐布局
Ghostty 窗口 1 Ghostty 窗口 2
┌──────────────────┐ ┌──────────────────┐
│ │ │ │
│ ssh rog-work │ │ ssh rog-btop │
│ 工作区域 │ │ btop 监控 │
│ │ │ │
└──────────────────┘ └──────────────────┘
每个窗口独立 SSH、独立 zmx session,互不干扰。 Ghostty 标题栏自动显示 [rog-work] ~/code 和 [rog-btop] btop — ~。