# 主机与连接

## 主机编辑器

按 **⌘N** 新建主机，或轻点已有主机进行编辑。编辑器有四个标签 —— **连接**、
**高级**、**转发**、**命令片段** —— 以及一条**连接**栏。在 iPhone 上，同样的
四个部分显示为按钮 —— **连接**、**高级**、**隧道**、**命令片段** —— 其中连接
字段和隧道规则会先暂存，直到你轻点保存（其他编辑会像在 iPad 上一样立即
生效）；两种设备上的编辑器是同一个。

连接标签中是基本项：**名称**、**地址**、**端口**（1–65535）、**用户**、
**身份**（来自你的[密钥](https://bambouville.com/docs/zh-hans/keys/)页面的密钥）和**密码**。你在这里输入的密码
作用域限于会话：它只为本次活动会话保留，绝不持久化。唯一的例外是通过
[附近设置](https://bambouville.com/docs/zh-hans/nearby-setup/)或[接力](https://bambouville.com/docs/zh-hans/continuity/)配置、并使用密码认证的
主机 —— 你在新设备上输入一次的密码会作为已保存的凭据留在本设备的钥匙串中，
绝不同步，之后编辑器可以更改它（保存后会替换已存储的密码）。

![主机编辑器及其四个标签 —— 连接、高级、转发、命令片段 —— 以及连接字段和连接栏。](https://bambouville.com/docs/assets/img/host-editor.png)

*顶部横排四个标签，每个标签底部都固定着一条连接栏。*


## 传输方式：SSH 或 Mosh

每台主机选择一种传输方式：

- **ssh** —— 单条 SSH 连接；tmux 标签停留在主会话上。
- **mosh** —— 基于 UDP 的 mosh 终端。Mosh 让你的会话在 Wi-Fi ↔ 蜂窝网络漫游和
  睡眠/唤醒之间保持存活，在丢包链路上也更跟手。它要求主机上安装
  `mosh-server`。tmux 标签使用第二条 SSH 侧信道。[mosh 页面](https://bambouville.com/docs/zh-hans/mosh/)有完整
  说明，包括真正的回滚缓冲。

Mosh 的 UDP 流量无法穿过堡垒机：如果你经[跳板主机](#跳板主机)使用 mosh，而
mosh 服务器不可达，Tessera 会告诉你（「经跳板链无法访问 mosh…」）并改用 SSH
重新连接。

## 启动模式

- **自动 tmux** —— 接入（或创建）该主机专属的 tmux 会话，名称是确定性的
  `tessera-XXXXXXXX`，在应用重装后依然记得。这是默认选项，也是让掉线变得
  无害的那一个。
- **具名 tmux** —— 接入一个你自己指定名称的 tmux 会话；含非法字符的名称会
  回退到自动生成的那个。
- **自定** —— 逐字执行的启动命令。在 ssh 下发送给登录 shell；在 mosh 下由
  `mosh-server new -- <command>` 执行。

参见 [tmux](https://bambouville.com/docs/zh-hans/tmux/) 了解 tmux 模式能带来什么，以及
[端口转发](https://bambouville.com/docs/zh-hans/port-forwarding/#mosh-与转发)了解启动模式如何与隧道相互影响。

## 跳板主机

任何已保存的主机都可以用作 SSH 堡垒机（ProxyJump）：在主机编辑器中选择它。
链会嵌套 —— 跳板主机自身的跳板会延长这条链 —— 编辑器会显示由此得到的路径
（「a → b → 主机」），并对断裂的链给出警告。

- 每一跳都用自己的身份或密码独立认证。使用密码的跳会在编辑器的跳板主机部分中
  出现一个 **密码 · \<跳板名称\>** 字段，只为本次活动会话保留；在每一跳都填好
  之前，连接始终不可用。
- 主机密钥提示按跳出现，堡垒机在先，每次都会指明正在验证的端点。
- 断裂的链会安全失败：如果某台跳板主机被删除，依赖它的主机会在编辑器中给出
  警告，连接会失败，而不会悄悄改为直连。错误会指出它来自哪一跳
  （「跳板主机 \<名称\>：…」）。
- 在[免费版](https://bambouville.com/docs/zh-hans/unlimited-hosts/)中，单独保存的堡垒机会占用一个自己的已保存
  主机名额。

## 高级标签

- **系统标志** —— 连接时自动检测，也可手动设置（macos、ubuntu、debian、
  alpine、linux、raspbian）。
- **标签**和**备注** —— 供你自己整理。
- **环境变量** —— 每行一个 `KEY=value`；开头可选的 `export ` 会被去掉。值会
  原样传给远程 shell —— `$HOME`、`$(…)` 和引号都按字面生效。
- **终端背景** —— 针对单台主机覆盖全局[背景](https://bambouville.com/docs/zh-hans/appearance/)。

> 环境变量和启动脚本片段只在 tmux 会话启动时执行。如果你为某台主机更改了
> 它们，而它的 tmux 会话已经存在，请在服务器上结束该会话以应用更改。

## 命令片段

命令片段标签中有一个**启动脚本片段**：连接后立即发送的命令（上面同样的 tmux
注意事项也适用）。

## 连接卡住时

会话建立期间，启动浮层会说明它当前所处的阶段 —— **正在连接**，对 tmux 主机
接着是**正在启动 tmux**（SSH）或**正在接入 tmux**（mosh），然后是
**正在接入窗格**。如果某个阶段大约十二秒没有进展，浮层会说明卡在哪一步
（「仍在 正在连接 — 握手尚未完成。」），并给出出路，而不是一直转圈：

- **编辑主机** —— 打开主机编辑器，适用于地址、端口或密钥有问题时，
- **重试** —— 拆掉这次尝试，从头重新连接，
- **返回** —— 放弃并回到你的主机列表。从卡住的尝试中退出会将其彻底断开 ——
  服务器上不会留下任何东西在运行。

计时器按阶段计算，因此仍在推进的慢速连接永远不会触发它。如果 tmux 本身起不
来 —— 没有安装、会话无法启动，或主机自己的 dotfiles 在登录时就已经启动了
tmux —— Tessera 会把你带进一个纯 shell，并用横幅准确说明发生了什么，而不是
一直等一个永远不会应答的 tmux。

![启动浮层在连接时卡住：阶段说明写着「正在连接」，下方是 tmux 会话名，警告行写着「仍在 正在连接 — 握手尚未完成。」，再下方等着编辑主机、重试和返回三个按钮。](https://bambouville.com/docs/assets/img/stall-notice.png)

*十二秒没有进展：浮层会说明卡在哪个阶段，并给出一条出路。*

## 会话

Tessera 可以对任意主机同时保持多个会话。自动 tmux 主机是单例 —— 每台主机一个
tmux 控制会话（具名 tmux 则是每台主机、每个会话名一个）—— 而使用自定命令的
主机可以有多个（「名称 #2」、「名称 #3」）。侧边栏的**活动**部分列出每一个
会话，标注为「名称 (tmux)」、「名称 (tmux: 会话名)」或「名称 #N」，每个都带
一个断开连接按钮。在 iPhone 上，同样的列表就是**会话**标签。

轻点即可在会话之间切换，也可以用 **⌘⇧K** / **⌘⇧J** 在相邻会话间移动，或打开
**⌘K** 快速切换面板：输入即可筛选会话（最近使用优先）和智能体 —— 在查询前加
`@` 可限定为智能体。

## 会话恢复

**设置 → 终端 → 启动 → 先前的连接**控制全新启动时的行为：

- **询问** —— 显示一个「重新打开先前的连接」面板，选项为「始终重新打开」/
  「重新打开」/「以后再说」。
- **始终** —— 静默重新连接。
- **从不** —— 从干净的状态开始。

在 iPhone 上，选择面板被换成一个**启动时恢复**开关。只有密钥材料完好的已保存
主机会话才可恢复。

回到前台的处理方式相同，但更聪明：Tessera 会等待**每一个**打开的会话报告自身
状态，然后再决定要重新连接什么，因此当多台主机同时掉线 —— 或某个 mosh 会话
很晚才承认自己已经死了 —— 每一个都会被重新连接，没有谁被落下。在此期间，启动
浮层会统计其余的会话（「+2 个会话正在重新连接」）。
Tessera 刻意保持单窗口（iPad 上没有多场景）；侧边栏和面板 —— 在
[iPhone](https://bambouville.com/docs/zh-hans/iphone/) 上是标签栏和切换器 —— 就是你四处移动的方式。
