终端
Mobile SSH 终端专为手机和平板操作而设计。它结合了终端画布、拓展按键栏、多会话窗格、滚动处理和重连行为。
终端基础
- 终端采用 xterm 风格的行为,支持颜色和光标键处理。
- 回滚缓冲区默认保留 5000 行,可在设置中改为 1,000、10,000 或 50,000 行。
- 输入前先点按窗格以选中它。
- 在终端窗格上双指捏合可更改文字大小。手势稳定后,Mobile SSH 会调整远程 PTY 的大小。
- 双击窗格(或使用其展开按钮)进入全屏模式。在 Android 上使用返回键,或在 iOS 上使用收起按钮,回到网格。
多会话网格
Mobile SSH 最多可同时运行八个 SSH 会话。每个会话以窗格形式显示在终端网格中。点按窗格以选中它,或使用 + Add Session 开始另一个连接。
窗格标题会告诉你当前身处何处。在 Android 上,它显示该窗格真实的工作目录——来自向 tmux 查询或 shell 通过 OSC 7 上报,并在应用打开期间持续刷新;在 iOS 上,它显示远端设置的标题,没有标题时回退为 user@host:port。
关闭窗格会断开该 SSH 会话。返回起始屏幕时,活动会话仍可通过 Active Sessions 使用。
Eternal Terminal(ET)
每个已保存的服务器都可以使用两种传输方式之一,在添加或编辑服务器时用 Transport 选择器选定:
- SSH —— 标准的 SSH 连接(默认)。
- Eternal Terminal —— 一种 ET 会话,可在网络中断、设备休眠和 IP 地址变化后继续存活,而无需重启你的 shell。
ET 会把会话保留在服务器上,因此当手机切换网络或从休眠中唤醒时,Mobile SSH 会重新接回同一个正在运行的 shell,而不是新开一个。这让它非常适合移动数据、Wi-Fi/蜂窝网络切换以及长时间运行的命令。
ET 需要主机上有一个 etserver 进程。如果服务器上没有,Mobile SSH 可以通过现有的 SSH 连接为你安装并启动它——无需手动配置服务器。ET 就绪后,选择 Eternal Terminal 传输方式连接即可。
拓展按键栏
两个平台都把十三个终端按键放在触手可及的位置——正是触摸键盘上不便输入或干脆没有的那些键。在 Android 上,它是会话底部的一条按键带(接上硬件键盘时会自动隐藏);在 iOS 上,它悬在软键盘上方。
两套默认按键数量相同,但并不完全一致:
| Android | iOS | |
|---|---|---|
| 默认按键 | ESC TAB CTRL 方向键 HOME PGUP END PGDN ⌫ ⌨ | ESC TAB CTRL ⇧ 方向键 HOME END PGUP PGDN ⌨ |
| 差异 | 有退格键,没有 Shift | 有粘滞 Shift,没有退格键 |
这一行按键从不横向滚动。 当宽度放不下时,按键会均分空间并换到第二行;仍然多出来的按键会收进 ⋯ 溢出菜单。没有任何按键会藏在滑动手势之后或被屏幕边缘裁掉,而且已经按下待用的修饰键,对你从溢出菜单中选出的按键同样有效。
CTRL 是粘滞修饰键:点按 CTRL,再输入 C,即可发送 Ctrl-C。Shift 在 iOS 上比在 Android 上更「粘」——在 iOS 上,它还会让你在软键盘上输入的下一个字符变成大写,而在 Android 上,它只作用于按键栏自身的按键(Shift+Tab、Shift+方向键)。
按住方向键或 PGDN 之类的按键不放,它会连续重复。
键盘行为
终端通过原生直通方式连接屏幕键盘:你每输入一个字符都会立即发送到远程 shell,自动更正与预测建议均已关闭,因此键盘绝不会在输入到达 shell 之前改写它。这让 Vim、tmux、htop、less、使用特殊组合键的 shell 以及远程密码提示都保持可预测——没有需要关闭的建议缓冲。
- 点按终端显示键盘: 启用后,点按终端会请求系统显示屏幕键盘。
软键盘语音听写仍然可用:听写出的文本会像其他输入一样直接提交到 shell。
硬件键盘
外接与 Bluetooth 键盘可在 Android 和 iOS 上直接驱动终端。除普通字符外,Mobile SSH 还映射方向键、Home/End、PgUp/PgDn、Insert、Delete、Esc、功能键 F1–F12、Ctrl+按键以及 Alt/Option 作为 Meta 的组合键,还有 Shift+Tab。这些修饰键可与拓展按键栏的粘滞修饰键组合使用。
粘贴
向请求粘贴的程序(bash、Vim 以及其他支持括号粘贴的应用)粘贴时,内容会被括号粘贴标记包裹,因此多行剪贴板内容会作为文本插入,而不会被逐行自动执行。只有真正的粘贴才会被包裹;输入和听写的文本不受影响。
选择、复制、分享
在终端内长按可选中手指下方的单词,然后拖动手柄进行调整。选择工具栏提供三个操作:
- 复制 —— 将所选文本放入系统剪贴板。复制后所选内容仍保持高亮,因此你可以分享、再次复制或扩展它。
- 分享 —— 将所选文本传给系统分享面板(邮件、笔记、消息等)。
- 全选 —— 将选择扩展到整个可见终端缓冲区,然后复制或分享。
在终端中查找
搜索整个终端缓冲区——回滚缓冲与可见屏幕——并在匹配项之间跳转。从终端控件中打开查找,输入查询词,然后逐个跳转到命中项。此功能在 Android 和 iOS 上均可使用。
颜色、斜体与远程剪贴板
- 终端可渲染 24-bit 真彩色 与 斜体,因此主题化提示符、语法高亮和 TUI 的显示效果与桌面端一致。
- OSC 52 剪贴板: 当远程程序复制文本时(tmux
set-clipboard、Vim/Neovim 的 OSC 52 yank),它会落入手机剪贴板——这样你就能从服务器复制并粘贴到本地应用中。 - 在 Android 与 iOS 上,宽 CJK、emoji 与组合字符(字素簇与零宽连接符)都能被正确测量和绘制,内置的 Nerd Font 也可绘制 powerline、starship、devicon 与 Material Design 图标字形,否则系统字体只会将其显示为空白方框。
Shell 集成与内嵌图像
- Shell 集成(OSC 133): 当你的 shell 发出 OSC 133 提示符标记时,Mobile SSH 可以在提示符之间逐个跳转,并在长时间运行的命令完成时提醒你。在 Android 与 iOS 上均可用。两个应用都不会自行注入这些标记——必须由你的 shell 发出(通过
PROMPT_COMMAND/precmd钩子,或 starship)。在 Android 上,提示符导航默认关闭,需要在 Settings → Shell integration 中启用;在 iOS 上,只要开始收到标记,相应菜单就会自动出现。 - 选中输出: 在某条命令的输出内任意位置轻触,即可选中整段输出——包括 300 行之前那次构建的报错,而不只是最后一条命令——然后复制、分享或继续扩展选区。
- 内嵌图像: 使用 Kitty graphics 协议的程序可直接在终端中绘制图像,在 Android 与 iOS 上均可用。图像在捏合缩放和重新换行后依然保留:它们以字符单元格为单位测量并跟随所在行,而不会被丢弃并留下一片空白。它们属于主屏幕的功能,当全屏 TUI 接管画面时会被清除。
- 马赛克字形(Android): 方块、盲文、六分格与八分格字符由应用自行绘制,而不是向字体索取,因此
chafa、timg与 ANSI 字符画能严丝合缝地铺满网格——无论你选了什么字体,都不会有缝隙或空白方框。 - 真实工作目录(Android): 窗格标题显示该窗格实际所在的位置,来自向 tmux 查询或 shell 通过 OSC 7 上报,而不是最后一个提示符碰巧打印出来的内容。
外观与按键
在 Android 与 iOS 上,Settings 让你可以定制终端:
- 字体: 选择系统等宽字体、JetBrains Mono 或 Source Code Pro。
- 配色方案: Default、Solarized Dark 或 Light、Gruvbox、Dracula 或 Nord——实时应用到已打开的面板。
- 拓展按键栏: 添加、移除、重新排序和隐藏按键,定义你自己的转义序列按键,并恢复默认,还带有实时预览,可以看到最终确切的换行效果。Android 把它放在 Keys 标签页;iOS 放在 Extra keys → Customize keys 下。
- 从预设添加: 一个约 45 个按键、分为六组的预设面板——
F1–F12、^C^D^Z^R^L等 Ctrl 组合键、|~/_:等符号,以及修饰键。F1–F12以普通转义序列发送,因此无需FN组合键。Android 还提供 📎 Attach a file 按键,可打开文件选择器并把文件上传到正在运行的会话;iOS 则提供INS、DEL以及一个可展开数字行的FN键。 - 回滚缓冲大小: 1,000、5,000、10,000 或 50,000 行(默认 5,000 行)。对新打开的面板生效。
- 文字大小: 一个滑块,与捏合缩放并存。
- 主题: 整个应用可设为跟随系统、浅色或深色。
恢复默认会还原随版本发布的默认设置,而不是把今天这份列表固定下来,因此后续版本的改进依然能到达你手上。修改会实时应用到已经打开的面板。
滚动
Mobile SSH 根据终端状态路由滚动手势:
- 在正常 shell 输出中,滑动会滚动本地回滚缓冲区。
- 在鼠标模式的终端应用中,滚动会发送鼠标滚轮转义序列。
- 在没有鼠标模式的备用屏幕应用中(如许多 tmux 会话),滚动会进入 tmux 复制模式并发送逐行滚动命令。
在 Android 上,在启用鼠标跟踪的程序内轻点,会被作为该单元格上的鼠标左键点击送出,因此 htop、vim 以及点击聚焦的窗格都能响应触摸。在 iOS 上,同样的程序中轻点只会弹出键盘而不会产生点击;只有滚轮滚动会被上报。
如果你在回滚状态下输入,Mobile SSH 会返回到实时终端视图。
tmux 行为
Mobile SSH 会观察发出的 tmux attach 和新建会话命令,例如:
tmux attach -t work
tmux a -t work
tmux new -A -s work
当你在 tmux 中时连接断开,应用可记住该服务器最后的 tmux 会话名称,并在重连后尝试重新挂接。如果未观察到明确的会话名称,但应用知道你处于备用屏幕的类 tmux 会话中,它可能会尝试通用的 tmux attach。
此行为为尽力而为。如果远程 tmux 会话不再存在,远程 shell 仍然可用。
Tmux 管理器
Mobile SSH 内置了一个 tmux 管理器,让你无需敲前缀组合键就能浏览和控制 tmux。在已连接的会话中用 Tmux 按钮打开它。它分三部分列出内容:
- Sessions —— 服务器上的每一个 tmux 会话。
- Windows —— 所选会话中的窗口。
- Panes —— 所选窗口中的窗格。
在管理器中你可以:
- 把某个会话 附加 到当前终端。
- 创建 新的会话或窗口,并 重命名 它们。
- 水平或垂直 拆分 窗格、缩放 窗格,以及 结束 会话、窗口或窗格。
- 按名称或创建日期 排序 会话。
🔔 会标记出智能体正在等待输入的会话,因此你一眼就能发现暂停下来的 Claude Code 或 Codex 运行,并附加到它。这与上文的 reattach 提示互为补充:reattach 逻辑会在重连时自动恢复你上次的会话,而管理器则给你完整的手动控制。
两个平台也都可以管理同一主机上的多个 tmux 服务器(socket),并按名称或创建日期对会话排序。
Herdr 与 Zellij(Android)
Android 为另外两种复用器提供了同样的能力。它们各有自己的工具栏图标,而且只有在应用确实在服务器上找到该程序之后,图标才会出现——因此不必运行 which,工具栏就已经告诉你那台机器上装了什么。
- Herdr 使用它自己的一套术语:会话、工作区、标签页、窗格。每个窗格都会显示其智能体的状态——工作中、需要你、空闲——被阻塞的智能体可以直接从列表中作答。Herdr 自身的状态会汇入应用的智能体角标,因此即使服务器上没有安装钩子,这一套也能工作。
- Zellij 会列出会话、标签页与窗格,并支持附加、重命名、结束和拆分。被结束的会话仍会留在列表中,因此附加即可让它们复活,而删除则会彻底忘掉它们。标签页与窗格的详细信息需要 Zellij 0.44 或更高版本;在更旧的版本上,页面只显示标签页名称并说明原因。拆分需要有客户端附加在该会话上,页面会直接说明这一点,而不是给出一个注定失败的按钮。
如果 herdr 或 Zellij 已安装但不在登录 shell 的 PATH 中,页面会主动提出为你加上。
每个已保存的服务器都有一个 Attach on connect 设置:Auto(自动检测)、Nothing、tmux、herdr 或 Zellij。自动模式会先选你在该服务器上最近用过的那一个,其次是有活动会话的那一个,再次是已安装的那一个——而在尚未探测过该服务器时,它宁可什么都不附加,也不会瞎猜。
iOS 应用目前只支持 tmux。
智能体提醒
当远程的 AI 编码智能体——Claude Code、Codex、Gemini——被阻塞、正等着你时,Mobile SSH 会告诉你。它并不是靠读取你的终端输出去猜测。这里有两条路径,各自能提供的细节程度不同。
铃声
开箱即用的情况下,来自你没在看的那个会话的终端响铃会触发提醒,许多工具已经在发出的桌面通知转义序列(OSC 9、OSC 777)同样会触发。在你刚敲完键之后立刻到来的响铃会被忽略,因此普通的 shell 补全提示音不会来打扰你。
这条路径不需要任何配置,但应用只知道有什么东西响了。
智能体钩子
要让应用知道是哪一个智能体在等待、正在做什么,请在服务器上安装智能体钩子:
- iOS: Settings → Agent alerts → Install Agent Hook。如果连接了多台服务器,它会询问装到哪一台。
- Android: 长按某个会话的窗格标题,选择 Install agent hooks。
这会在该服务器上写入一个小的 shell 脚本 ~/.mobile-ssh/agent-hook.sh。它与具体智能体无关——它接受命令行参数,而不是解析某一家厂商的格式——因此任何能执行命令的东西都可以通过它上报。删除该文件即可干净卸载。
一旦某个智能体通过钩子上报:
- 窗格标题会显示
claude · needs you,或者标出它正在运行的工具。 - 智能体被阻塞的窗格会加上琥珀色边框。你正在看的那个窗格不受影响——提示就在眼前。
- 工具栏角标会统计所有连接上正在等待的智能体数量,上限显示为
9+。 - Agents 界面列出每个连接上的每一个智能体,包括它在做什么以及已经等了多久。
无需打字即可作答
当智能体提出的问题带有固定的几个选项时,应用会在「智能体」列表中为每个选项显示一个按钮——最多六个。在 Android 上,你还可以点按窗格标题里的智能体标签。
你的回答不会被输入到会话里。它会通过单独的通道写入一个文件,再由钩子取走,因此作答不会破坏屏幕上正在显示的内容。应用会拒绝发送提示本身并未提供的选项;如果连接期间已经断开,它也会明确告诉你,而不是悄无声息地失败。
设置
两个平台上提醒都默认开启,并为通知、声音、振动,以及「你当前正在查看的会话是否也应提醒」分别提供开关。
有一项默认设置值得知道:声音仅限耳机。在没有插入或配对耳机时,提醒会发出通知和振动,但不会播放提示音。如果你希望通过手机扬声器听到提醒,请关闭该项。
这里没有灵敏度设置,也没有提示音选择器——控制项只有开和关。
全屏终端程序
对于 Vim、less、htop、ncurses 工具和 tmux 窗格等程序:
- 输入会直接传递给程序——没有自动更正或建议缓冲进行干扰。
- 使用拓展按键栏输入
ESC、方向键、PGUP和PGDN。 - 如果文字太小,使用捏合缩放,然后稍等片刻让远程终端大小稳定。