Skip to content

远程

文档编写中

部分内容可能尚不完整。

ThinkTerm 里的远程工作区,目标是用起来和本地一样。会话由多路复用服务端持有,而不是由你面前的窗口持有,因此合上笔记本、换一台机器、或者掉线,都不会终止正在进行的工作。同一个多路复用服务端也可以持有你的本地终端,所以下面讲的多数内容并不只适用于通过网络访问的机器。

按 Space 分组的实时终端,含当前离线的机器

SSH 主机簿

ThinkTerm 维护自己的主机列表,与你的系统 SSH 配置分开存放。在它旁边,~/.ssh/config 里定义的主机以只读视图呈现 —— ThinkTerm 会读取那个文件,但从不写入。

ThinkTerm 自己的列表里,每台主机可以记录用户名、身份文件、任意 SSH 选项、默认工作区,以及一个保存的密码。操作系统探测默认开启,连上的主机可以报告自己运行的是哪个发行版。

三种连接方式

一台主机可以用以下任意一种方式打开。

普通 SSH —— 直连会话。连接断开时会话随之结束。

Mosh —— 一种漫游的 UDP 会话,能容忍网络切换和睡眠。ThinkTerm 默认用 mosh-server new -s -l LANG=en_US.UTF-8 启动远端;该命令可以按主机单独修改,当远程机器上的 mosh-server 位置不寻常时就需要这么做。

ThinkTerm Connect —— 常驻的多路复用。只有这一种能给你完整的工作区:服务端持有会话树,因此多个客户端可以同时接入并看到同一套结构,某个客户端离开也不影响其余一切继续运行。

保存的密码

主机簿里保存的密码以 AES-256-GCM 加密存储。密钥单独存放在一个文件 secret.key 中,位于工作区数据目录内,与主机簿相邻。

在 macOS 和 Linux 上,该密钥文件以 0600 权限创建,因此这台机器上的其他账户读不到它。

但要清楚它挡不住什么。这个权限挡的是其他用户,挡不住任何以你自己身份运行的东西。文件同步、备份任务,或者你启动的任何程序,读一个 0600 文件毫无障碍 —— 而 secret.key 与加密后的主机簿在同一个目录里,所以凡是复制走这个目录的,两半都拿到了,可以从容解密。把密钥放在磁盘上而不是系统钥匙串里是一个有意的取舍,这就是它的代价。

Windows 上密钥文件没有特殊权限

0600 权限仅在 Unix 上施加。在 Windows 上,secret.key 以普通文件写入,继承所在目录的默认权限。如果这台机器由多个账户共用,或者该目录的权限异常宽松,就应当把保存的密码视为"任何能访问该文件夹的人都可读"。

如果你不想保存密码,改用身份文件即可 —— 它在同一个编辑界面里,也是按主机设置的字段。

断开不等于删除

这是两个不同的动作,ThinkTerm 有意把它们分开。

断开 只是让当前客户端脱离。服务端继续运行,里面的每个会话都保持存活。之后重新连接,工作区会恢复原样。

在服务端删除 会终止这些会话。这是破坏性操作,而当你只是想合上笔记本时,这绝不是你要的。

网络意外中断后,ThinkTerm 会自行重连并恢复会话。在重试期间,它会显示为"正在连接",而不是报为失败。

但自动重试是有上限的。连续失败约两分钟后,ThinkTerm 会停止尝试,等你按下"重新连接"。放弃时不会拆掉任何东西 —— 域仍然处于接入状态,每个窗口和 pane 都还在 —— 但超过这个时长的中断,需要你手动操作一步才能恢复。

挺过一次升级

以前更新 server 意味着停掉它,而停掉 server 会结束它持有的所有会话。现在不必这样了。

运行中的 server 可以把自己的 pane 直接交给新的二进制:新进程接管伪终端、其上运行的进程、终端内容,以及窗口和标签结构,然后在同一个 socket 上开始应答。客户端只会看到一次重连并按 id 重新绑定,pane 里面的东西不会重启。

有两类 pane 不会被带过去:进程已经退出的,以及本身就是通往别处的通道的——比如作为独立域打开的 sshtmux pane。它们会被剪除而不是移交。

这就是 更新远端 server 时保留会话 背后的机制,完整流程见 更新

本地会话放进会话 server

多路复用服务端并不只服务于远程主机。设置里有这一项:

本地终端放在后台会话 server 里 —— 本地终端跑在本机的 mux server 中,ThinkTerm 退出、崩溃或更新后会话仍在。下次启动 ThinkTerm 时生效。

开启后,退出 ThinkTerm 不再是结束本地工作的那个动作,Thread 布局也会被沿用而不是重建。该设置默认关闭,切换后在下次启动时生效,不是立即生效。

在多台设备之间移动

多个客户端可以同时连到同一个 ThinkTerm Connect server。同一时刻由一台设备驱动前端,而这个权限——交接租约——属于设备而不是进程:一块由主机和用户标识的屏幕。

正是这个区分让重启的代价变得很低。原本在驱动的那台设备断开后再回来(GUI 重启了、笔记本的 SSH 重新建立了),它不会被当成又一块来排队的屏幕,而是在第一帧画面上就把租约收回,不需要点击。

其他设备仍然必须显式接管。一直连着的渲染端不会自动继承租约;而一旦某台设备显式认领过,之前的持有者回来也不会把它抢回去。

为了让远程用起来像本地做了什么

以下行为适用于 ThinkTerm Connect 域上的会话:

  • 在等待会被察觉时,打字不等待往返。 预测性本地回显让按键不等服务端就显示出来,但只有当实测往返时延达到阈值(默认 100 毫秒)时才启用。低于这个值,服务端自己的回显已经够快,预测保持关闭。本地会话则完全不预测。
  • 分屏不是本地专属的奢侈品。 分屏树、二级标签栏、拖拽分屏、拖动分隔条调整大小,在远程会话中同样可用,行为与本地一致。
  • 尺寸不会抖动。 拖动分隔条不会导致回弹、挤压或重同步风暴。
  • 滚轮是准确的。vimless 这类鼠标模式程序里,原始的滚动格数被保留,因此滚动既不会太快也不会太慢。
  • 客户端状态归你所有。 焦点和选区以本地为准,不会被服务端回显打乱。每个客户端持有自己的配色,在一台设备上换主题不会改变另一台。
  • 图片能传到远程 pane。 图片和 kitty 协议的动图在远程 pane 里的显示与本地一致;正在流式传输的图片会留在屏幕上,而不是每一帧都丢掉。

相关

  • 文件与笔记 —— 浏览与传输远程主机上的文件
  • 配置 —— 主机簿及其密钥的存放位置