⚙⚙⚙

// 添加主机

在主机列表界面点击 + 按钮添加新服务器(在 iOS 上会弹出一个小菜单:选择添加主机)。

必填字段

  • 主机名 / IP — 服务器地址或 IP,支持 IPv4 和 IPv6。
  • 端口 — 默认为 22。如果服务器使用其他端口运行 SSH,请修改此项。
  • 用户名 — 要登录的 Unix 用户(例如 ubuntu、root、deploy)。
  • 认证方式 — 选择密码或 SSH 密钥(推荐)。

主机指纹验证

首次连接时,SSHBorg 会显示服务器指纹并要求您确认。这是一项安全检查,确保您连接的是正确的服务器而非冒充者。接受前请通过可信渠道核实指纹与服务器管理员提供的一致。

确认后,指纹将保存在本地。若日后连接时指纹发生变化,SSHBorg 将发出警告——这可能表示服务器重建、密钥轮换或中间人攻击。

// 提示
您可以随时用以下命令检查服务器指纹:
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub

// 主机分组

当服务器列表越来越长时,可以把主机整理到可折叠的彩色分组中,例如生产、家庭实验室、客户。

创建分组

  1. 添加或编辑主机,打开分组下拉菜单。
  2. 选择新建分组…,输入名称并从预设颜色中挑选一个。
  3. 保存主机后,主机列表会将该分组显示为独立的区块。

在 iOS 上也可以单独创建分组:点击 + 按钮 → 新建分组。

使用分组

  • 折叠 / 展开 — 点按分组标题即可折叠或重新展开。状态会被记住,重启应用后也不会丢失。
  • 颜色 — 分组颜色显示为标题上的圆点,并作为组内主机图标的着色。
  • 编辑 — 长按分组标题并选择编辑,可重命名分组或更换颜色。
  • 删除 — 长按标题并选择删除。组内的主机不会被删除,只是变为未分组。

颜色可以从快捷色板中选择,在 Android 上也可以用渐变取色器自由调配——iOS 上从色板中选择。主机还可以拥有自己的颜色——在主机编辑器中、分组下方设置——它会覆盖分组颜色,对未分组的主机同样有效。

未分组的主机始终显示在列表顶部;如果不创建任何分组,列表的外观和行为与以前完全相同。

列表排序

在设置 → 主机列表排序中选择列表的排列方式:

  • 字母顺序(默认)——分组按名称,组内主机按标签。
  • 最近使用——最后连接过的主机排在最前;从未使用过的排在最后。
  • 最常使用——连接次数最多的主机排在前面。
  • 手动——由你自己设定的顺序。

前三种方式中分组始终保持字母顺序,因此分组标题不会移动,只有组内的主机重新排列。手动排序时分组也可以移动。

要调整顺序,请选择手动,然后打开某个主机或分组标题的菜单——⋮ 按钮(iOS 上为 …)、长按,或Android TV 遥控器上的菜单键——并使用上移 / 下移。主机只能在自己所属的区块内移动:要放到另一个分组,请在主机编辑器中更改分组。切换到手动时会完整保留当时屏幕上的顺序,因此不会发生跳动;之后新增的主机会排到所属区块的末尾。

// SFTP 文件管理器

SFTP 文件管理器让您直接从手机浏览、上传、下载、重命名和删除服务器上的文件。在主机列表界面,通过主机菜单中的文件打开它。

浏览

点击文件夹进入。使用返回箭头或点击路径栏中的任意段落跳转到上级目录。点击文件会打开可对它执行的操作:下载、在编辑器中打开、重命名、删除。

符号链接显示有小链接图标角标。点击符号链接会导航到其目标:若指向目录则进入,若指向文件则与普通文件相同。

上传文件

点击 上传 按钮(↑)从手机存储中选择一个或多个文件。上传立即开始,进度显示在界面顶部。

下载文件和文件夹

点击文件行右侧的 下载 图标即可立即下载。要下载整个文件夹,点击其旁边的 下载 图标——SSHBorg 将下载整个目录树并保存到手机的 Downloads 文件夹。

如果目标位置已存在同名文件,对话框将询问您是 覆盖、跳过该文件,还是 取消整个传输。

// 关于符号链接
文件夹下载时,指向目录的符号链接会被跳过——只下载普通文件(包括指向文件的符号链接)。这可防止意外的递归下载。

批量选择与操作

点击工具栏中的选择项目进入选择模式,然后勾选需要的项目。工具栏显示当前选择的操作:

  • 下载 — 一次性下载所有选中的文件和文件夹,带进度对话框和取消支持。
  • 删除 — 删除所有选中的项目。删除非空文件夹会递归删除其所有内容。此操作不可撤销。

在服务器上移动文件

在文件或文件夹的菜单中选择剪切,或用选择项目一次选中多个,然后打开目标文件夹,点击列表上方出现的那条栏中的粘贴。移动由服务器自己完成:不下载也不上传,因此任何大小的文件都是瞬间移动。

如果目标位置已有同名条目,SSHBorg 会先询问再动手。文件可以被替换,也可以与现有文件并存;同名的两个文件夹只能并存,因为没有任何 SFTP 服务器能合并文件夹——mv 同样会拒绝。在服务器的两个不同磁盘之间移动也会被拒绝:移动就是重命名,而重命名无法跨越文件系统。那需要复制,而 SSHBorg 目前还不支持。

编辑文件

点击文件打开其菜单,选择在编辑器中打开,即可直接在服务器上修改。手机上不留任何文件:内容读入内存、编辑后直接写回服务器。

文件原样返回。字符编码会被识别并在保存时沿用,LF 或 CRLF 换行符保持不变,原本结尾没有换行的文件依旧没有,权限也不变。如果编码判断有误,点一下编辑器底部那一行换一个即可——列表里只有能够原样还原该文件字节的编码,所以选错只会显示错乱,不会损坏文件。

保存时先在原文件旁写入临时文件,再改名顶替,因此连接中途断开也不会在服务器上留下写了一半的文件。

文件最大可打开 4 MB,无论多长:只绘制屏幕上的行,因此几兆字节的文件与短文件滚动起来一样顺畅。再大的文件请用终端里的 nano 或 vi,那边没有任何上限。

配置文件会着色——注释、字符串、数字、键、节标题、shell 变量和 XML 标签——依据文件名判断,文件名看不出时则依据内容的形态:shell 脚本、nginx 与 sshd 风格的配置、INI、YAML、JSON 和 XML。普通文章、笔记和日志则刻意不着色,那里的颜色只会变成干扰。着色只是外观,不会改变任何一个字节。

十六进制编辑器

非文本文件会在十六进制编辑器中打开:左侧是偏移量,中间是字节,右侧是可打印字符,底部是十六进制数字键盘。点选一个字节并输入两位数字即可替换。数值会变,长度不变,因此文件中每个偏移量都保持原位。文件菜单中的以十六进制打开可以用这种方式打开任何文件;被误判为二进制的文本文件(例如混入了一个 NUL 字节)仍可从同一个对话框以文本方式打开。

// iOS
  • 上传 — 打开操作菜单(⋯)并选择上传…;通过系统的“文件”浏览器选择文件。
  • 下载保存位置 — 保存到 SSHBorg 自己的文件夹,“文件” App 中显示在我的 iPhone → SSHBorg(iPad 上为我的 iPad)。下载从不覆盖任何文件:若名称已被占用,新文件会得到一个带编号的名称。
  • 文件夹 — 长按文件或文件夹打开其菜单:下载、重命名、删除。
  • 多选 — 在“操作”菜单中选择选择项目,然后勾选项目。长按则会打开该项目的菜单。
  • 上传冲突 — 对话框提供覆盖、保留两者(上传的文件会获得新名称)或取消。
  • 编辑 — 编辑器和十六进制编辑器在这里也有:长按文件打开菜单,可选择在编辑器中打开和以十六进制打开。加载时文件会经过应用的临时目录,读取完毕后立即删除。
  • 保存 — 文件直接写回原文件,而不是先写到旁边的临时文件再重命名覆盖,因此保存中途断线可能留下只写了一半的文件。

// SSH 密钥

基于密钥的认证比密码更安全,设置完成后无需记忆或输入任何内容。

生成密钥

点击主机列表界面顶部的钥匙图标打开 SSH 密钥,然后生成新密钥。SSHBorg 支持:

  • Ed25519 — 推荐。快速、紧凑且安全。
  • ECDSA(P-256 / P-384) — 与旧版服务器有良好兼容性。
  • RSA(2048 / 4096 位) — 最大兼容性,但速度较慢。

为密钥取一个有意义的名称(例如 my-vps 或 work-server),便于日后识别。

// 安全说明
SSHBorg 有意不允许导出私钥。密钥永不离开设备。如果您需要在其他设备上使用,请在该设备上生成新密钥并分别在服务器上授权——这是更安全的做法。

在服务器上授权密钥

生成密钥后,点击密钥查看其 公钥。复制并粘贴到服务器上目标用户的 ~/.ssh/authorized_keys 文件中。

  1. 在手机上,打开 SSHBorg → SSH 密钥(主机列表界面的钥匙图标)→ 点击密钥 → 复制公钥。
  2. 登录您的服务器(使用密码或已有密钥)。
  3. 将公钥追加到授权密钥文件:
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    echo "ssh-ed25519 AAAA...您复制的密钥..." >> ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
  4. 尝试用 SSHBorg 连接——应无需密码即可登录。
// 服务器要求
确保服务器的 /etc/ssh/sshd_config 中有 PubkeyAuthentication yes。大多数发行版默认启用,但部分加固镜像可能禁用此选项。

加密存储的密钥和密码

开启 设置 → 安全 → 加密敏感数据,即可使用保存在设备安全硬件中的密钥(Android 上为 Android 密钥库,iOS 上为钥匙串)加密存储私钥和已保存的主机密码。在您启用之前该选项保持关闭;首次启动时显示的安全提示会指向它。

加密数据与设备以及本次安装的应用绑定:卸载应用后,已存储的密钥无法恢复,您需要生成新密钥并重新在服务器上授权。如果您在手机上保存了敏感的服务器凭据,强烈建议同时启用应用锁和此选项。

受密码短语保护的密钥只在导入时询问一次,之后以已解锁的形式保存:密码短语本身不会写入设备。密码短语通常还会用在别处,而私钥只代表它自己——况且密钥与自己的密码短语存放在一起,本来也谈不上被它保护。在这里保护密钥的是应用的私有存储、加密敏感数据和应用锁。由较早版本导入的密钥仍处于加密状态,无法完成认证;列表会标出这些密钥,需要重新导入。

有两种加密格式应用打不开:OpenSSL 的容器(BEGIN ENCRYPTED PRIVATE KEY)和 PuTTY 的 .ppk。导入时会明确说明,而不会把密钥导入一半。请用创建它的工具解密后重新导入——在副本上操作,不要动你唯一的那份文件:

ssh-keygen -p -N "" -f id_ed25519_copy
openssl pkcs8 -in key.pem -out key_plain.pem

PuTTYgen 可通过 Conversions → Export OpenSSH key 转换 .ppk。

// iOS
iOS 的做法相同:导入时只询问一次密码短语,密钥以解锁状态保存,密码短语不写入任何地方。iOS 比 Android 多拒绝一种格式:除了 OpenSSL 容器和 PuTTY 的 .ppk,还有旧式 PEM 加密(Proc-Type: 4,ENCRYPTED),即 ssh-keygen -m PEM 带密码短语时写出的格式。请先解密这类密钥再重新导入。

// 命令建议

在终端输入时,SSHBorg 会在键盘上方显示建议栏。建议来自您所连接用户的 Shell 历史记录。

工作原理

终端会话开启时,SSHBorg 从远程服务器读取 Shell 历史文件,依次尝试以下位置:

  1. ~/.bash_history — Bash Shell 的默认位置
  2. ~/.zsh_history — Zsh 的默认位置(若设置了 $HISTFILE 也会检查)
  3. ~/.local/share/fish/fish_history — Fish Shell 用户

使用第一个存在且可读的文件。输入时,命令会实时过滤并以标签形式显示在建议栏。点击标签即可插入命令。

故障排除

没有建议出现

  • 历史文件可能尚不存在(首次登录,或 Shell 未配置保存历史)。
  • 确保 Shell 已配置写入历史。对于 Bash,在 ~/.bashrc 中添加:
    HISTFILE=~/.bash_history
    HISTSIZE=10000
    HISTFILESIZE=20000
  • 对于 Zsh,在 ~/.zshrc 中添加:
    HISTFILE=~/.zsh_history
    HISTSIZE=10000
    SAVEHIST=10000
    setopt APPEND_HISTORY SHARE_HISTORY

建议来自错误的用户

// 已知限制
如果您以某个用户连接后运行 sudo su - root(或用 su 切换到其他用户),建议栏仍显示原始登录用户的历史,而非 root 的历史。这是因为 SSHBorg 在 Shell 启动前使用连接凭据读取历史文件。

若要获取 root 的命令建议,请在 SSHBorg 中单独添加配置为直接以 root 登录的主机条目(若服务器允许)。

// 终端手势

终端除键盘输入外,还响应以下触摸手势:

  • 滚动历史 — 上下滑动浏览终端回滚缓冲区。
  • 缩放 — 捏合手势放大或缩小文字。
  • 复制文本 — 长按终端任意位置进入选择模式。拖动控制柄调整选择区域,然后点击 复制选中内容 只复制高亮文本,或点击 全部复制 复制所有输出。点击其他位置取消。 在 iOS 上,长按会选中手指下的单词并打开系统菜单,其中有拷贝、粘贴和全选;拖动选区任一端可扩大选区。
  • 粘贴 — 使用键盘打开时可见的扩展键栏中的 粘贴 按钮。

全屏程序。 占据整个屏幕的程序 — tmux、vim、nano、less — 没有自己的回滚缓冲区,因此在它们运行期间,视图会停留在当前画面,而不会滑入下面的 shell 输出。

要在其中滚动,需要由程序自己处理。在 tmux 中,将 set -g mouse on 加入 ~/.tmux.conf:此后滑动即可翻阅手指所在窗格的历史。任何接受鼠标输入的程序同理,例如设置了 set mouse=a 的 vim。使用 screen 时,请检查 ~/.screenrc 中是否有 altscreen on — 许多系统默认关闭它,此时 screen 会直接画在普通回滚缓冲区之上。

// 终端设置

在设置 → 终端中可以按需调整终端:

  • 终端配色 — 经典深色方案(黑底白字)、在强光下更易读的浅色方案(白底黑字),或跟随应用主题(随应用深浅色主题自动切换)。更改立即生效,包括已打开的会话。
  • 保持屏幕常亮 — 终端打开时阻止屏幕熄灭。查看日志或运行长时间命令时很实用。默认关闭。
  • 默认字体大小 — 新终端会话的初始文字大小;每个会话中仍可用双指缩放。
  • 回滚缓冲区、反向滚动和命令建议 — 分别控制保留多少输出历史、滚动方向,以及上文介绍的建议栏。
  • 双击操作 — 可选:在终端双击时发送 Tab(自动补全),或连按两次 Tab(列出所有候选项)。默认关闭。 在 iOS 上,此选项关闭时双击会选中一个单词。

// 额外按键栏

软键盘打开时,上方会出现一排快捷按键。左右滑动按键栏可访问所有按键。

修饰键

Ctrl 和 Alt 是粘滞切换键——点击其中一个,再点击字母键即可发送组合键。每次按键后自动重置。

  • Ctrl+C — 中断正在运行的进程。
  • Ctrl+D — 发送 EOF / 关闭 shell。
  • Ctrl+Z — 暂停进程。
  • Ctrl+L — 清屏。

文字模式

拼写检查图标可在终端模式和文字模式之间切换键盘。终端模式(默认)下自动更正和词语建议被禁用——适合输入命令和文件路径。文字模式下键盘像普通文本框一样工作,启用词语建议和自动更正。通过 SSH 输入自然语言时很有用,例如使用 Claude Code 或其他交互式工具。

在 Android 上,文字模式也是语音输入的前提。键盘的麦克风键需要一个真正的文本框来写入,因此在终端模式下语音输入不会产生任何内容——听写前请切换到文字模式。

导航与编辑

  • ESC — Escape 键。
  • Tab — shell 自动补全。
  • ↑ ↓ ← → — 光标方向键。
  • Home / End — 跳到行首或行尾。
  • PgUp / PgDn — 向上翻页 / 向下翻页。
  • Del — 向前删除(光标右侧的字符)。
  • 粘贴 — 将剪贴板内容粘贴到终端。

功能键

向右滑动按键栏可访问 F1 至 F12 功能键。

布局与自定义按键栏

按键栏有多种布局。点按栏上的 ⇄ 键即可切换:按键会让位于可用按键栏列表,点按其中一个即可,选择会被记住。也可以在设置 → 终端 → 额外按键栏 → 自定义中选择和管理按键栏。

  • 标准 — 经典的单行滚动栏。
  • 自然 — 按使用频率排列的单行,包含 / - | ~,方向键按键盘顺序排列(← ↑ ↓ →)。
  • 自然 ×2 — 两行铺满宽度:ESC / - Home ↑ End PgUp 在上,Tab Ctrl Alt ← ↓ → PgDn 在下。
  • 自然 ×3 — 同上,另加第三行功能键。
  • 精简 — 只有 ESC、Tab、Ctrl 和方向键,适合窄屏。

要创建自己的按键栏,可复制一个预设(旁边的 ⋮ 菜单,iOS 上为长按)或新建一个。编辑器会按实际外观显示按键栏:点按一个按键将其选中,然后用下方按钮把它左右移动、移到另一行、更改、在其后添加按键或移除。每一行可以滚动(按键保持自然宽度)或填满屏幕宽度(手机上每行最多约九个按键)。最多三行;按键大小可调。

除了常规按键,自定义按键栏还可以包含文本键:任意文本原样发送——单个 |、sudo 前缀或一整条命令。用 \n 表示回车、\t 表示 Tab、\e 表示 Esc,这样 ls -la\n 就成了一键宏。另有两个操作键:固定在键盘关闭时仍保持按键栏可见,键盘显示或隐藏键盘。

自定义按键栏包含在设置备份中。在 Android TV 上一切都可用遥控器操作:编辑器的按键和按钮都能用方向键到达。

// 代理转发

SSH 代理转发允许 SSHBorg 中存储的密钥用于验证从远程服务器内部发起的进一步连接——例如 git clone 私有仓库,或跳转到第二台服务器。

在 SSHBorg 中启用转发

添加或编辑主机时,启用 代理转发 开关。SSHBorg 将作为该会话的 SSH 代理。

服务器端配置

服务器必须允许代理转发。检查 /etc/ssh/sshd_config:

AllowAgentForwarding yes

大多数系统默认如此。修改后重启 SSH 守护进程:

sudo systemctl restart sshd

每主机客户端配置(可选)

如果您也从笔记本或台式机连接此服务器,可在本地 ~/.ssh/config 中持久配置转发:

Host myserver
    HostName 203.0.113.42
    User ubuntu
    ForwardAgent yes
// 安全说明
代理转发使远程服务器暂时获得访问您的 SSH 代理套接字的权限。在会话活跃期间,该服务器上的 root 用户(或受攻击的进程)可能使用您的密钥连接其他地方。仅在您信任的服务器上启用转发。

// 旧版加密算法支持

一些旧版服务器——网络设备、嵌入式设备或运行过时 OpenSSH 版本的系统——仅支持现代 SSH 客户端默认不再通告的加密算法。

在主机设置中启用允许旧版加密开关后,SSHBorg 会将以下算法追加到协商列表:

新增算法

  • 加密算法: aes128-cbc、aes192-cbc、aes256-cbc、3des-cbc
  • 密钥交换: diffie-hellman-group14-sha1、diffie-hellman-group-exchange-sha1、diffie-hellman-group1-sha1
  • 主机密钥类型: ssh-dss(DSA 1024-bit)

服务器始终协商双方都支持的最强算法,因此启用此选项不会削弱与现代服务器的连接安全性。

// iOS
在 iOS 上无法使用 ssh-dss 主机密钥:应用所用的 SSH 库已不再包含 DSA,因此仅提供 DSA 主机密钥的服务器,即使开启此选项,也无法从 iPhone 或 iPad 连接。
// 安全提示
此列表中的算法在密码学上被认为较弱。仅对无法升级的服务器启用此选项。

// 连接断开与终端复用器

SSH 是手机与服务器之间的实时 TCP 连接。一旦连接中断——哪怕只是一秒——会话及其中运行的一切都会丢失。

移动端连接断开的原因

移动网络特别容易断开连接,原因如下:

  • IP 地址变更 — 出行或切换基站时,运营商可能分配新的公网 IP。由于 TCP 连接与 IP 地址绑定,现有 SSH 会话立即失效。
  • Wi-Fi ↔ 移动数据切换 — 在 Wi-Fi 和移动数据之间切换会改变 IP 并中断所有开放的 TCP 连接。
  • 空闲超时 — 运营商和 NAT 路由器通常在几分钟后断开空闲连接。长时间运行但静默的会话(查看日志、等待输入)容易受此影响。
  • 信号丢失 — 隧道、地下车库或信号弱区域都可能短暂断网,足以终止会话。
  • Android 后台限制 — 只要有会话打开,SSHBorg 就会保持一个带通知的前台服务,因此 Android 不再在固定时间后停止会话:保持打开的会话会在你使用其他应用时继续工作。仍可能终止它的是手机回收内存,或某些厂商对后台应用施加的省电策略 — 如果会话自行停止,首先可以把 SSHBorg 排除在电池优化之外。重新打开应用即可重新连接。
  • iOS 会在后台挂起应用 — SSHBorg 离开屏幕约三十秒后,iOS 会将其挂起,连接随之断开。回到应用时,SSHBorg 会自动重新连接(仅在未保存密码时才会询问密码),并在输出中标记该位置:这是一个新的 shell,旧 shell 中运行的内容已经丢失。在 iOS 上,终端复用器是在使用其他应用时让工作继续运行的唯一方法。
// 重要
如果您在 SSH 终端中直接运行长时间命令(编译、备份、数据库迁移),连接断开时命令会立即被终止。任何未完成的工作都可能处于不一致状态。

解决方案:tmux 或 screen

终端复用器在服务器上运行持久会话,完全独立于 SSH 连接。连接断开时,会话及其中运行的一切继续运行。重新连接后,重新附加即可找到一切如常。

这是从手机管理服务器最有用的习惯。

tmux 快速入门

tmux 在大多数现代 Linux 发行版上可用,是推荐的选择。

# 开始一个新命名会话
tmux new -s work

# 从会话分离(保持运行)
Ctrl+B,然后 D

# 列出正在运行的会话
tmux ls

# 重新附加到会话
tmux attach -t work

# 附加到最近的会话
tmux attach

screen 快速入门

screen 较旧,但在几乎所有 Unix 系统上都可用,包括可能未安装 tmux 的最小服务器镜像。

# 开始一个新命名会话
screen -S work

# 从会话分离
Ctrl+A,然后 D

# 列出正在运行的会话
screen -ls

# 重新附加到会话
screen -r work

移动端推荐工作流程

  1. 用 SSHBorg 连接服务器。
  2. 立即开始或重新附加 tmux/screen 会话:tmux attach || tmux new -s main
  3. 在复用器内运行命令。
  4. 若连接断开,重新连接即可——会话仍然存在。
// 提示
您可以在服务器的 ~/.bashrc 或 ~/.zshrc 中添加 tmux attach || tmux new -s main,这样每次通过 SSHBorg 登录时都会自动启动复用器会话。

// 跳板机

跳板机(也称堡垒主机)是一台中间服务器,用于访问无法从互联网直接到达的目标服务器。SSHBorg 原生支持单跳和多跳链。

在 SSHBorg 中配置跳板机

  1. 在 SSHBorg 中将堡垒服务器添加为普通主机(例如 bastion)。
  2. 将目标服务器添加为另一台主机。
  3. 在目标主机设置中,将 跳板机 设为您创建的堡垒主机。
  4. 在堡垒主机条目上启用 代理转发——这允许密钥通过堡垒转发到目标服务器进行认证。
// 工作原理
SSHBorg 先与堡垒建立 SSH 连接,然后通过它向目标服务器打开转发的 TCP 通道。您的私钥永不离开手机——堡垒只代理加密流。

多跳链

如果需要跳过多台中间服务器(例如 互联网 → 堡垒 → DMZ → 目标),为每跳创建一个条目并链接:

  • bastion — 无跳板机,启用代理转发
  • dmz — 跳板机 = bastion,启用代理转发
  • target — 跳板机 = dmz
// 重要
代理转发必须在每个中间跳上启用,而不只是第一个。缺少代理转发会导致认证链断裂,最终服务器连接将失败并显示"permission denied"错误。

等效的手动配置(仅供参考)

桌面端 ~/.ssh/config 中的等效配置如下:

Host bastion
    HostName bastion.example.com
    User admin
    ForwardAgent yes

Host target
    HostName 10.0.1.50
    User ubuntu
    ProxyJump bastion
    ForwardAgent yes

使用此配置,笔记本上的 ssh target 会透明地跳过堡垒。

防火墙要求

  • 您的手机必须能在 SSH 端口(通常为 22)上访问堡垒。
  • 堡垒必须能在其 SSH 端口上访问目标。
  • 目标不需要从手机直接可达。

// 多会话

SSHBorg 允许您同时保持多个 SSH 终端会话和 SFTP 文件管理器会话,甚至可以连接到不同的服务器。

  • 点击主机即可打开终端,或在主机菜单中选择文件打开文件管理器。如果该主机已有打开的会话,同一菜单还可以新建会话。
  • 使用终端下方的标签页在已开启的会话之间切换;拥有多个会话的主机会打开带编号的选择器。
  • 只要网络连接正常,会话在后台保持活跃——在 iOS 上只能维持很短时间,参见连接断开。
  • 主机列表在每台主机旁显示小角标,标明活跃的 SSH 和 SFTP 会话数量,方便一目了然。
// 提示
长时间运行的命令(编译、备份、日志监控)在切换到其他会话时仍会继续运行。如果希望它们在 SSH 连接断开后也能继续,请在服务器端使用 tmux 或 screen。

// 应用安全

应用锁

在 设置 → 安全 → 应用锁 中选择保护方式:无(默认)、仅生物识别(指纹或人脸解锁)、设备锁(除生物识别外,还可使用设备的 PIN、图案或密码),或应用内 PIN 或密码短语。启用锁定后,SSHBorg 在显示任何主机、凭据或会话数据前都会要求验证。如果验证被拒绝或你取消了验证,应用会留在自己的锁定界面上,并提供一个重试按钮——它不会退出,因此解锁后原先打开的会话仍在。

应用内 PIN 或密码短语 可在任何设备上使用,即使没有生物识别硬件或系统屏幕锁——因此它是 Android TV 上的正确选择。更改或移除时会先要求输入当前的。忘记后无法找回:你需要清除应用数据或重新安装,因此请保留主机的备份。

您可以设置不活动超时——在后台等待该时长后,应用会自动锁定。

// iOS
应用锁提供无、仅生物识别(面容 ID 或触控 ID)和设备锁(设备密码或生物识别)。没有应用内 PIN 或密码短语。

截图保护

SSHBorg 默认阻止截图和录屏,防止敏感的终端内容通过最近应用界面或截屏工具泄露。

如果需要截图(例如分享终端输出),可在 设置 → 安全 → 允许截图 中临时禁用截图保护。

// iOS
iOS 不允许应用阻止截屏或录屏,因此没有此设置。启用应用锁后,SSHBorg 一离开屏幕就会遮盖其内容,主机和终端不会出现在 App 切换器中。

凭据存储

开启加密敏感数据后(参见SSH 密钥),密码和私钥会使用保存在 Android 密钥库(Android 10+ 上由硬件支持)或 iOS 钥匙串中、仅限本设备的密钥加密存储。凭据永不写入外部存储,也不会传输到任何地方。

// 备份说明
由于加密密钥永远不会离开设备的安全硬件,密钥无法从云备份或设备备份中恢复,也不会自动迁移到新手机。更换设备前,请确保在新设备上生成新密钥并在所有服务器上授权。

最安全的设置

上面每一项单独都有用。合在一起,就是这个应用能做到的最严密的配置,只需两分钟:

  1. 打开设置 → 安全 → 加密敏感数据。
  2. 把应用锁设为仅生物识别——若不愿依赖手机的生物识别,则设为PIN 或密码短语。
  3. 把锁定超时设为立即,最多 30 秒。
  4. 在应用内生成一把新密钥,名字要能看出它属于哪台设备。
  5. 把该密钥授权到你的服务器,用它代替密码。

在手机上生成的密钥从未在别处存在过:没有更早的副本可能已经泄露,也没有别的机器需要清理。一台设备一把密钥还意味着,丢了手机只不过是 authorized_keys 里的一行——删掉它,其他设备照常可用。这也正是名字值得好好取的原因。

这些措施都做不到的一点:如果手机本身被攻破,那把密钥也随之失守,无论它在磁盘上受什么保护。给密钥加密码短语同样救不了它——能读取应用存储的东西,也能读取你键入的内容。这正是 SSHBorg 只在导入时询问一次密钥的密码短语、并以解锁状态保存密钥而不保存密码短语的原因(见SSH 密钥)。

// 配置备份

SSHBorg 可以将主机配置和应用设置导出并导入为 JSON 文件。这样您可以将服务器列表转移到另一台设备,或保留一份可移植的配置备份。

// 重要
备份包含主机配置和应用设置(终端、外观、行为)。密码和 SSH 密钥从不导出 — 密钥材料需要在新设备上重新设置。不过备份会记录每个主机所用密钥的名称:如果在导入前重新创建同名密钥,其主机会自动重新关联。

导出

前往 设置 → 备份 → 导出备份。通过系统文件选择器选择文件保存位置。文件默认命名为 sshborg_backup.json(iOS 上为 sshborg-backup-日期.json)。

导入

前往 设置 → 备份 → 导入备份。选择之前导出(或手动创建)的 .json 文件。SSHBorg 将其与现有主机列表合并:

  • 名称与现有条目匹配的主机将被更新。
  • 具有新名称的主机将被添加。
  • 文件中不存在的主机保持不变。
  • 更新已有主机时会保留其已保存的密码、密钥和已接受的主机密钥——备份从不包含这些内容。
  • 没有密钥的主机会关联到名称与导出的 keyLabel 匹配的密钥(若存在);否则忽略该字段。
  • 被更新的主机会保留本设备已有的使用数据——最后连接时间、计数和手动位置;文件只补上缺少的部分。

JSON 格式

导出文件是一个标准 JSON 对象。您也可以手动创建它,从其他来源批量导入服务器列表。

{
  "version": 7,
  "exported_at": "2026-05-14T10:00:00Z",
  "groups": [
    { "name": "生产", "color": -1754827, "position": 0 }
  ],
  "hosts": [
    {
      "label":           "我的 VPS",
      "hostname":        "203.0.113.42",
      "port":            22,
      "username":        "ubuntu",
      "agentForwarding": false,
      "jumpMode":        "simple",
      "jumpHosts":       null,
      "jumpHostIdList":  null,
      "portForwardings": null,
      "sftpStartMode":   "last",
      "sftpStartDir":    null,
      "sftpShowHidden":  false,
      "allowLegacyCiphers": false,
      "position":        0,
      "lastConnected":   1757404800000,
      "connectCount":    12,
      "keyLabel":         "我的 VPS 密钥",
      "group":           "生产"
    }
  ],
  "settings": {
    "night_mode":            0,
    "scrollback_lines":      2000,
    "terminal_font_size":    13,
    "terminal_color_scheme": 0,
    "double_tap_action":     0
  }
}

可选的 settings 对象包含应用设置,导出时会自动写入;手动创建文件时可以省略。

字段说明

  • label — SSHBorg 中显示的名称。导入时用作唯一合并键。必填。
  • hostname — 服务器地址或 IP(IPv4 或 IPv6)。必填。
  • port — SSH 端口。默认值:22。
  • username — 登录用户名。必填。
  • agentForwarding — true 启用 SSH 代理转发。默认值:false。
  • jumpMode — "simple"(使用 jumpHosts 文本)或 "host_list"(使用 SSHBorg 内部主机 ID)。手动创建文件时请使用 "simple"。
  • jumpHosts — 以逗号分隔的跳板机列表,格式为 [用户名@]主机[:端口]。仅在 jumpMode 为 "simple" 时使用。
  • portForwardings — 以换行符分隔的本地端口转发规则,使用 SSH -L 语法,例如 "8080:localhost:8080"。
  • sftpStartMode — SFTP 起始目录:"last"(记住上次访问的目录)、"fixed"(始终使用 sftpStartDir)、"home"(服务器主目录)。默认值:"last"。
  • sftpStartDir — 当 sftpStartMode 为 "fixed" 时使用的路径。
  • sftpShowHidden — true 时在该主机的 SFTP 浏览器中显示隐藏文件(点文件,以 "." 开头的名称)。默认 false。
  • allowLegacyCiphers — 设为 true 可启用上文介绍的旧式加密算法。默认为 false。
  • keyLabel — 此主机所用 SSH 密钥的名称。导入时,如果存在同名密钥,则关联到该主机;否则忽略该字段。密钥本身从不包含在备份中。
  • group — 主机所属分组的名称。分组列在顶层的 groups 数组中,包含 name 和 color(ARGB,带符号 32 位整数)。如果主机引用的分组不在数组中,会用默认颜色自动创建 — 因此手写文件时可以完全省略该数组。
  • color — 主机的可选颜色(ARGB,带符号 32 位整数),会覆盖分组颜色。
  • position — 主机在手动排序中的位置,按其所属区块(未分组区块或某个分组)内部计数。省略则排到末尾。分组在 groups 数组中也有各自的 position。
  • lastConnected — 最后一次连接的时间,以 Unix 纪元起的毫秒数表示。用于“最近使用”排序。
  • connectCount — 向该主机开启过多少个终端会话。用于“最常使用”排序。
// 可选字段
除 label、hostname 和 username 外,所有字段均为可选。省略的字段将使用默认值。

// ANDROID TV

SSHBorg 可在 Android TV 和 Google TV 上运行。可用遥控器的方向键操作,但由于这是一款文字较多的应用,外接实体键盘会带来很大便利。

使用遥控器导航

  • 方向键 — 在行与控件之间移动焦点。
  • OK(中键) — 主操作:连接主机、打开文件夹、下载文件、展开分组。
  • 返回 — 上一级或退出当前界面。

打开某一行的菜单

要对某一行进行重命名、删除、编辑、复制或下载,请打开其菜单:在选中该行时按遥控器的 菜单(选项)键,或 长按 OK。单按 OK 执行主操作,而非打开菜单。

输入文字:请使用实体键盘

强烈建议使用 实体键盘(USB 或蓝牙,Android TV 两者都支持),终端基本上离不开它。有了键盘,文本框和 shell 都能正常使用。

没有键盘时,屏幕键盘仍可用于简短输入:聚焦一个输入框,按 OK 打开,输入后按键盘上的 OK / 前往 确认——在密码提示框中这会直接连接。但用屏幕键盘输入 shell 命令并不实用。

在 TV 上锁定应用

TV 通常没有指纹识别或屏幕锁,因此请用内置的 PIN 或密码短语 锁保护应用(设置 → 安全)——它完全可用遥控器或键盘操作。参见 应用安全。

// 开源许可证

SSHBorg 是自由软件,以 GNU General Public License v3 发布。Android 版与 iOS 版的源代码都在 GitHub 上。它使用了以下库,各自遵循自己的许可证:

  • mwiede/JSch — Android 上的 SSH 协议 —— BSD 风格许可证
  • Bouncy Castle — Android 上的加密实现 —— MIT 风格许可证
  • sora-editor — 用于在服务器上修改文件的文本编辑控件(Android) —— GNU LGPL v2.1
  • libssh2 — iOS 上的 SSH 协议 —— BSD 许可证

它们都不会自行连接任何地方:SSHBorg 只会连接你指定的服务器,以及你点击链接时的 sshborg.com。没有任何统计库、广告库或追踪器。

⚙⚙⚙