使用指南

如何使用 SharkTTY

这个应用能做的一切,大致按你会用到它们的先后顺序排开:从第一台 SSH 主机,到操控留在家里那台 Mac 的第四块屏幕。适用于 iPhone 和 iPad 上的 SharkTTY,以及 Mac 上免费的伴侣应用 SharkTTY Desk。

连接自己的服务器无需任何账号。这里介绍的每一项功能都是免费的。

第一部分

终端

只要跑着标准 sshd,SharkTTY 就能为它打开一个 shell —— VPS、NAS、Raspberry Pi、工作站都一样。纯 SSH 在对端不需要装任何东西。Mosh 和 ET 各自需要一个小的服务端程序,两者都是可选的。

添加第一台主机

打开「设置」,进入「主机」标签页,点右上角的 +。一台新主机有四项必须填,另外几项一开始可以先不管。

  • 「显示名称」「主机名」和「用户」。显示名称只给你自己看;留空就用地址代替。
  • 「SSH 端口」。这里是直接输入数字,而不是点步进器。除非服务器监听在别处,保持 22 即可。
  • 「认证」→「方式」:密码、密钥、键盘交互 / 2FA,或未选择。
  • 「连接方式」:SSH(直接)或 Mosh(加速)。以后随时可以改,其他设置不受影响。

密码有两种方式。「保存密码」把它存进本机的 iOS Keychain;开启同步后,它会经由 iCloud Keychain 端到端地跟着你走,绝不经过我们的服务器。「连接时输入」什么都不存,每次连接都问你一遍。如果服务器会自己发出提示 —— 一次性验证码、硬件令牌 —— 那就改选「键盘交互 / 2FA」:你在连接时逐条作答,什么也不会被保存。

保存主机,然后点它连接。在主机列表里,单击是选中,双击直接连接。

已经有配置文件了

「设置」→「主机」→「从 SSH 配置导入」既接受粘贴进来的 ~/.ssh/config,也可以让你选一个文件。它只导入主机别名、地址、用户名和端口 —— 密码和私钥一概不导。使用 ProxyCommand 的条目会被跳过;带 ProxyJump 的条目先按直连导入,之后你可以手动为它指定跳板机。

永不离开设备的 SSH 密钥

密钥放在「设置」的「账户」标签页里。点 +,从三条路里挑一条:「生成密钥」「粘贴文本添加」或「从文件导入」。

  • 生成:给密钥起个名称,比如 id_ed25519,写个备注,比如 me@iPhone,再选一种算法。Ed25519(推荐)是默认项;ECDSA 和 RSA 留给较老的服务器,而在手机上生成 RSA 4096 要等上几秒。
  • 粘贴或导入已有密钥:如果私钥是加密的,添加时输入它的口令。这个口令只用于在设备上推导并保存对应的公钥。
  • 装到服务器上:打开密钥,用「复制公钥」或「分享公钥」,把那一行加进主机的 ~/.ssh/authorized_keys,或者交给管理这台机器的人。

私钥留在 iOS Keychain 里。为某个密钥打开「使用 iCloud 同步」,它就会经由 iCloud Keychain 传到你的其他设备 —— 这与 Apple 同步密码走的是同一条端到端通道,不是我们的服务器。如果你登录了 SharkTTY 云账号,主机、脚本、驱动器映射和模板会同步,而密码、私钥和口令明确不会。

回到主机编辑器,「认证」→「方式」→「密钥」就能为这台主机挑选密钥。如果列表是空的,编辑器会直说,并让你先去「账户」标签页。

首次连接的指纹,以及它变了该怎么办

第一次连到一台服务器时,SharkTTY 会取回它的主机密钥,显示 SHA256 指纹,并给出「信任并连接」。请把它和服务器管理员公布的指纹对照,或者和在服务器上执行 ssh-keygen -lf 打印出来的结果对照。你一旦接受,它就被记录下来。

如果这个密钥后来变了,连接会停下并给出警告,而不是继续。老实的解读是:服务器重装过或轮换了密钥,或者有人正坐在你和它中间。只有在你清楚是哪一种时,才使用「信任新密钥并重连」。

如果要主动重新固定一台服务器 —— 比如你自己刚重建过它 —— 打开这台主机,用「清除已记录的主机密钥」。下一次连接会请你从头确认新的指纹。

SSH、Mosh 还是 ET

三者都能给你一个交互式 shell。区别在于服务器端需要准备什么,以及网络在你脚下变动时会发生什么。

传输方式 服务器端需要 网络切换后是否存续 值得知道的
SSH(直接) 除 sshd 外无需任何东西 任何你已经能 ssh 上去的主机都适用。
Mosh(加速) mosh-server 是,走 UDP 在 Wi-Fi 与蜂窝网络之间漫游;延迟飙升时在本地回显你的输入。
ET(实验性) etserver,默认端口 2022 是,走 TCP 适合彻底封禁 UDP 的网络。默认关闭,需要先在「设置」里打开。

Mosh 会预测你输入的内容,让屏幕在服务器回应之前就有反应。「设置」→「终端」→「默认预测模式」提供「自适应」—— 只在链路慢时才开启预测 —— 以及「总是」和「从不」。默认是自适应,对绝大多数人都合适。

ET 仍在测试中,要在「设置」里启用「ET (Eternal Terminal) 传输」之后才会出现。打开后,它会作为第三种连接方式出现在主机编辑器里。有一点需要提前想到:和 Mosh 的 UDP 一样,ET 的数据连接是从设备直接连到 etserver 端口的,不会经过跳板机转发。

回到你离开的那个会话

应用离开屏幕后不久,iOS 就会把它挂起,所以没有哪个移动终端能把一条 TCP 连接一直开着。SharkTTY 分两层来应对。

  • 应用会保留它最后看到的那屏内容。重新打开一个断开的标签页,你看到的是那张快照加一个「重新连接」按钮,而不是一片空白。
  • Mosh 和 ET 会在服务器一侧把会话本身保住,所以重连之后你回到的正是原地 —— 你离开时命令跑到一半,回来就还是跑到一半的地方。

在任何传输方式下,最靠得住的办法都是在服务器上用一个多路复用器。挂一个像 tmux new -A -s mobile 这样的连接脚本,每次重连都会重新接入同一个会话,而不是开一个新 shell。脚本在下一节。

还有一件小事能省下大量等待:在「设置」里打开「终端响铃系统通知」。当某个终端响铃、而那个会话又不是你正在看的那个时,iOS 会推送一条通知。在长时间运行的命令后面接上 printf '\a',跑完时手机就会告诉你。

脚本 —— 连接时随手带上的片段

SharkTTY 里的脚本,就是一段在连接建立之后立刻在终端里执行的 shell 文本。「设置」→「脚本」,点 +,然后要么从空白脚本开始,要么选「从模板新建…」。

模板选择器是按人们真正会重连去做的那些事分组的:

  • 会话保持 —— tmux、screen 和 zellij,每一个都写成重新接入,而不是再开一个。
  • 系统状态 —— 系统总览,或者用 htop 做资源监视。
  • 日志 —— 跟踪系统日志,或者跟踪某一个文件。
  • 容器 —— Docker 容器、Compose 服务、容器日志。
  • 服务管理 —— 服务状态与重启。
  • 系统更新 —— Debian/Ubuntu、RHEL/Fedora、Alpine 和 Arch 各有各的模板。
  • 备份 —— rsync 增量备份,或者运行你自己的备份脚本。

给主机设好「平台」,选择器就会自动收窄到适合那台机器的模板,不会在 Alpine 机器上给你 apt。模板生成的内容都可以再改,用「存为模板」把你自己的版本留到下次。

在主机编辑器里给主机挂上脚本,每次连接都会执行它。也可以让主机保持干净,连接时再选:主机列表里,「以脚本连接」和「直接连接」是两个独立的操作,双击某个脚本就用它连接。

输入:键盘辅助栏与悬浮键盘

系统键盘上方是一条键盘辅助栏,放着终端需要而 iOS 没有的键:Esc、Ctrl、Tab 和方向键,另外还有上传文件、显示或收起键盘、以及打开指点设备的按钮。

「设置」→「键盘」→「输入板」可以在系统键盘和「透明」—— SharkTTY 自带的屏幕键盘 —— 之间切换。这块悬浮键盘是一整块键盘,而不是一条:符号、Tab、回车、⌃⌥⌘ 修饰键、fn 键和 F 功能键,像真键盘那样排布,回车是跨两行的 L 形。你可以把它拖到任何位置、调整大小,并用设置浮层里的透明度滑块让它在终端上淡下去 —— 也可以一路调到完全不透明,如果你根本不想透过它看东西。

同一处设置里的「排列」涵盖美式英语、英式英语、日语 JIS、法语 AZERTY、德语 QWERTZ 和西班牙语。按键上方有一条候选栏,会随着你的输入给出可能的词和常用命令。顶栏的麦克风按钮有两种用法:轻点切换到语音板,长按则是按住说话,直接把结果送进候选栏。

「鼠标上报」决定触控板归谁。打开时,外接触控板或鼠标的点击和拖动会送给能理解它们的程序 —— vim、tmux、htop、less。关闭时,指针改为选择文本。只有在程序确实开启了鼠标支持时,这个开关才有区别。在 iPad 上,外接键盘和触控板全程可用。

语音输入,以及把话变成命令的 AI

按住麦克风说话。识别在设备本地进行:免费、离线、即时,什么都不往外送。听到的内容会作为可编辑文本落在语音板里,「注入」把它敲进终端。

录音按片段保存,所以你可以裁掉一段、只对那一段「重新识别」,而不必把整句重说一遍。「历史记录」保留过往录音,可以试听,也可以再识别一次。在 iPad 上,语音板像透明键盘一样悬浮,也能缩放。

AI 是可选的,也和识别相互独立。在「设置」里用你自己的密钥添加一个提供商 —— 支持 OpenAI、Claude、Gemini、Kimi 和 GLM 的 API 格式 —— 设好对话模型,如果这家提供商有转写模型,也一并设上。Claude 只做对话、没有音频 API,所以在它那里录音会回落到本地识别。提供商密钥留在本机 Keychain,绝不同步。

接上提供商之后,提示词模式会把你说的话改写成整洁的文本,或者一条可以直接跑的命令;「附带终端上下文」则让模型在回答前看到屏幕上的内容。对话面板把一段对话放在会话旁边,让你不用离开就能问。

如果你不想自备密钥,登录 SharkTTY 账号后就能使用官方云端模型。它们用点数支付,点数通过应用内购买获得,并在你的各台设备之间共享。无论走哪条路,本地识别始终免费。

传输文件

把文件送上服务器有两条路,适合的场合不一样。

  • 在会话里:键盘辅助栏上的「上传文件」按钮会把文件直接送到当前工作目录。上限是每个文件 64 MB,而且主机必须有一份应用能重复使用的凭据 —— 只用一次性验证码登录的服务器没法这么用。
  • 从主机列表:「通过 SFTP 浏览文件」会在那台服务器上打开一个文件管理器,可以新建文件夹、上传、下载,遇到重名时还会让你确认是否覆盖。

「设置」里的「文件」标签页把设备能访问到的存储映射成驱动器:iCloud Drive、共享文件夹、应用本地文件夹,或者按 URL 添加的 WebDAV 服务器。映射之后,驱动器就能在同一个文件管理器里浏览 —— 一份文件从 NAS 走到服务器,中间不需要一台笔记本。

一块屏幕上的多个会话

连接以标签页的形式打开,可以重命名。「平铺所有连接」把它们一起显示;「左右拆屏」和「上下拆屏」把两个并排放;「聚焦此连接」再把其中一个放回全尺寸。在 iPad 上,这是「盯着一次部署」和「一边跑部署一边看日志」之间的差别。

远程桌面和终端住在同一个工作区里,所以一个 Mac 会话和三个 shell 可以共享同一张网格。

通过堡垒机连到主机

在主机编辑器里设置「跳板机 (ProxyJump)」,就会先连到堡垒机,再经由它到达真正的主机。跳板机用它自己保存的密钥或密码做非交互式认证;要求键盘交互登录的堡垒机目前还不支持。

只有 SSH 连接会经过跳板机。Mosh 的 UDP 和 ET 的数据连接都是从设备直连目标 —— 在你打算从网络外部依赖它们之前,这一点值得先确认。

第二部分

你的 Mac 桌面,装进手机里

SharkTTY 的另一半,是一套完整的 Mac 远程桌面。它需要在 Mac 上装一个免费的伴侣应用 —— SharkTTY Desk —— 完全不需要端口转发、VPN,也不用碰路由器的任何设置。

在 Mac 上安装 SharkTTY Desk

SharkTTY Desk 是免费的,运行在 macOS 14 Sonoma 或更高版本的 Apple 芯片 Mac(M1 或更新)上。从 Mac 应用页面下载磁盘映像,把 SharkTTY Desk 拖进「应用程序」并打开它。它没有 Dock 图标,而是驻留在菜单栏,窗口从那里打开。

首次运行需要两项权限,应用面板会直接链到「系统设置」→「隐私与安全性」中对应的位置:

  • 屏幕录制 —— 必需,捕获画面靠的就是它。
  • 辅助功能 —— 只用于移动指针和输入。关掉「允许控制」就可以跳过它,那样你得到的是一台只能看的 Mac。
macOS 上的 SharkTTY Desk 窗口,显示连接、控制模式与查看者批准

开始之前先核对版本。SharkTTY Desk 0.9.0 需要 iPhone 或 iPad 上的 SharkTTY 1.6 或更高版本,双向音频需要 1.7 或更高。如果你暂时无法更新应用,较早的 SharkTTY Desk 0.5.0 版本仍然能配 1.6 之前的应用使用。

让 Mac 与应用配对

在 iPhone 或 iPad 的 SharkTTY 里点 +,选「添加远程桌面」。有三种填法:

  • 两端登录同一个 SharkTTY 账号,这台 Mac 会自己出现在列表里。
  • 用应用的扫描器扫 Desk 面板上的配对二维码。
  • 从 Desk 面板复制 deskpair 配对串再粘贴进来。它带着访问令牌,会存进 Keychain。

给这台桌面起一个你认得出的名字,然后「保存并连接」。如果这台 Mac 设置了放人进来之前先询问,应用会一直等到 Mac 前的人点「允许」。

别人也可以用链接把一台 Mac 分享给你。登录之后,分享过来的桌面会出现在「分享给我的」里。一个分享可以是只读的,可以设置过期,可以随时撤销,可以限制同时连接的人数,也可以限定只允许特定账号使用。

一眼看尽每块屏幕,还能自己排

一台接了多台显示器的 Mac 会把它们全部送过来。「拼合排列」决定布局 —— 左右、上下、四分屏或画中画 —— 你还可以重新排序,让它们和桌上的摆法对得上。每块屏幕按需流传,正是这一点让一台三显示器的 Mac 在手机上仍然好用。

iPad 上以四分屏排列的四块 Mac 屏幕,同时显示布局选择器、放大镜和 xHD、HD、SD 清晰度档位

点某块屏幕就接管它;切换显示器时,输入和指针会一起指向新的那块。想看细节时,用「聚焦」把单块屏幕放大。在调整模式下,可以拖动画面重新摆位,双指捏合缩放。

触控、虚拟鼠标与放大镜

直接触控是最快的上手方式:一根手指滑动指针而不点击,第二根手指落下就是在当前位置点击。双指轻点是右键。

需要精细操作时,还有一个带左、中、右三个键的虚拟鼠标:按住可以锁定拖拽,另有一个滚轮手势用于滚动。这些按键可以停靠成屏幕底部的一整块面板,向左或向右滑到你手所在的位置;屏幕键盘打开时,它还会抬到键盘上方。

放大镜以原生分辨率显示指尖底下那一小块区域 —— 从手机上点中偏好设置窗口里的一个复选框,靠的就是它。按键停靠之后,放大镜会正好待在光标上方,而不会往屏幕边缘飘。⌘、⌥ 和 ⌃ 是一次性修饰键:先点一下,再点它要作用的那个键。

键盘与 macOS 快捷键

一个带模式下拉的键盘按钮,用来在 SharkTTY 的悬浮键盘和「系统键盘 + 工具栏」之间切换。悬浮键盘带着 macOS 需要、而 iOS 不提供的修饰键和 F 功能键。

「快捷操作」菜单负责发送那些不方便敲的快捷键:聚焦搜索 Spotlight、调度中心、应用窗口和切换应用;窗口左半屏、窗口右半屏、窗口铺满、窗口居中、最小化窗口和隐藏应用;关闭窗口、退出应用和强制退出;区域截图和全屏截图;以及锁定屏幕。剪贴板双向同步,所以你可以在 Mac 上复制、在手机上粘贴。

网络不好时的画面质量

视频是用 ScreenCaptureKit 采集、硬件编码的 H.264,档位由客户端来挑:xHD 呈现 Mac 的原生像素,HD 和标准用清晰度换带宽,流畅则把帧率放在一切之上。

把「弱网自动降级」保持打开,网络变差时会话会自己降下来,然后稳在那里,而不是一卡一卡。和 Mac 在同一个 Wi-Fi 下时,xHD 通常都没问题。

双向的声音

「远程声音」把 Mac 的系统声音送到设备上,所以 Mac 上放的视频或打进来的通话,你在手里就能听见。「麦克风输入」走的是相反方向,把 iPhone 或 iPad 变成 Mac 的麦克风 —— 你不在 Mac 跟前时,它上面的通话、录音和听写都靠这个。

两个方向都需要设备上的 SharkTTY 1.7 或更高版本。音频本身以 Opus 传输。

没有屏幕的 Mac,或者锁着的那台

「虚拟屏幕」仍处于测试阶段,它会新建一块贴合 iPad 尺寸的无头屏幕。没有显示器的 Mac mini 靠它,随身多带一个工作区也靠它。

Desk 可以通过网络唤醒休眠的 Mac,并在你连着的时候让它保持唤醒。如果你允许,它还能显示 macOS 的登录窗口,让你在重启之后远程输入密码解锁这台机器。

连接究竟是怎么接通的

两端都是主动向外拨号,所以路由器上从来不需要开端口。区别在于它们在哪条路径上会合。

  • 在同一网络下,Mac 和设备通过 QUIC 直接相连。延迟最低,中间什么都没有。
  • 跨网络时,会话会经过中转 —— 对于把其他一切都封掉的酒店和办公室 Wi-Fi,还有基于 443 端口的 WebSocket 回退。

会话端到端加密,中转始终只转发密文。在局域网内,多台 iPhone 和 iPad 可以同时查看并操控同一台 Mac;Mac 可以要求为每位新的查看者逐一批准,也能一键把任何人移除。

如果你不愿意碰别人的服务器,中转是开源的。在任意一台公网机器上运行 desk-relay:它在你传给 --bind 的地址上监听 QUIC,在 --wss-bind 上提供 WebSocket 回退,创建链接则由你自己选定的共享密钥保护。把 SharkTTY Desk 指向那个地址,扫描它随后给出的中转链接,流量经过的就只有你自己一方。整个过程不涉及 SharkTTY 账号。

技巧与故障排查

遇到问题的时候

Mosh 提示 mosh-server 无法启动

要么服务器上没装 mosh,要么它不在非交互式 SSH 登录能拿到的 PATH 里。装上 mosh,或者在「设置」→「主机」里给这台主机填上 mosh-server 的绝对路径 —— 多数 Linux 机器上是 /usr/bin/mosh-server,Apple 芯片的 Mac 上是 /opt/homebrew/bin/mosh-server。

ET 注册失败

远端缺少 etterminal,或者它不在非交互式 SSH 会话的 PATH 里。在那台机器上装好 Eternal Terminal(apt install et、brew install et),确认 etserver 正在运行、它的端口 —— 你没改过的话就是 2022 —— 没有被防火墙挡住,然后重试。这期间 SSH 和 Mosh 照常可用。

主机密钥变了,应用拒绝连接

这正是那道检查在起作用。正当的原因是服务器重建过或密钥轮换过;不正当的那一种,是中间有人。在点「信任新密钥并重连」之前先弄清楚是哪一种;如果是你自己重建的机器,就在主机编辑器里「清除已记录的主机密钥」,然后有意识地确认新指纹。

终端里的文件传不上去

有两条限制。文件上限是 64 MB,而且主机需要一份应用能重复使用的凭据 —— 只用一次性验证码登录的服务器没法用来上传。更大或更麻烦的传输,请用 SFTP 文件管理器或映射的驱动器。

应用找不到我的 Mac

先确认 SharkTTY Desk 确实在这台 Mac 上运行着,而不只是装了。如果这台 Mac 可能在休眠,请在 Desk 里启用通过网络唤醒。跨网络时,应用会先尝试直连、再回退到中转,因此连上可能要花几秒钟。

Mac 的画面是黑的,或者触控没有反应

画面全黑几乎总是意味着没有授予「屏幕录制」;画面不响应则说明没有授予「辅助功能」,或者「允许控制」是关着的。两者都在 Mac 的「系统设置」→「隐私与安全性」里,Desk 会直接链过去。

Mac 根本没出现在应用里

核对版本:SharkTTY Desk 0.9.0 需要手机或平板上的 SharkTTY 1.6 或更高版本。请从 App Store 更新,或者安装较早的 SharkTTY Desk 0.5.0 版本,它能配更早的应用使用。

到底什么才要花钱

你需要的都不花钱。应用、Mac 伴侣应用、本地语音识别以及上面所有功能都是免费的,连接自己的服务器也不需要账号。官方云端 AI 模型用点数支付;用你自己的提供商密钥则完全免费。打赏是可选的,可以一次性也可以按月,且不解锁任何功能 —— 按月打赏会持续续期,直到你在 Apple 账户设置里取消它。

可以开始设置了

SharkTTY 在 App Store 免费下载,Mac 版 SharkTTY Desk 同样免费。

关于 Mac 一侧的更多细节,见 SharkTTY Desk 页面 有问题的话,最快能得到回答的地方是 反馈板.