把折叠屏手机变成可靠的远程终端:Termux、SSH key、tmux 与历史搜索

URL
date
Oct 18, 2026
slug
termux-ssh-tmux-foldable-setup
summary
从后台断线到密钥登录、会话恢复和前缀历史搜索,附可重复执行的Termux初始化脚本。
status
Published
tags
Termux
SSH
tmux
Android
type
Post

把折叠屏手机变成可靠的远程终端:Termux、SSH key、tmux 与历史搜索

在手机上用 SSH 连进电脑,敲几条命令并不难。难的是切出去看一条消息,再回来时,终端已经吐出 Broken pipe。更烦的是,每次重新登录都要输密码,想找刚才那条命令,只能一下一下按上箭头。
这篇文章来自一次 OPPO Find N6 上的实际配置过程。目标不是把手机变成另一台笔记本,而是让临时维护少几次重复动作:密钥登录、一条短命令接回会话、输入前缀就能找到历史,以及换机时能重用配置。
先说明边界:我们确实观察到切换 App 后 SSH 断开,也在远端确认 tmux 会话仍在;但尚未在手机上完成逐项对照实验,因此不能断言某个 ColorOS 开关就是根因,更不能宣称已经治好了手机断线。

1. 先把三个问题分开

  • 连接层:SSH 是否还能通信。这受网络、VPN、Android 后台管理影响。
  • 会话层:断线之后,远端 shell 和程序是否还在。这是 tmux 负责的事。
  • 操作层:登录是否方便、历史能不能快速找回。这由 SSH key、alias 和 shell 配置解决。
手机 Termux → SSH → 远端电脑上的 tmux → shell / 正在运行的程序
      连接可能断开               会话可以继续保留
tmux 不是网络修复器。它的价值是让断线不再等于丢工作。主机重启、tmux 被结束或里面的程序自己退出,仍然会丢失该运行会话;它也不是备份。

2. 先确认命令到底在哪台设备执行

本文把两处环境明确分开:
  • 手机端:Android 的 Termux,下面主要按 Bash 说明。
  • 远端:通过 SSH 进入的 Mac,示例使用 zsh;Linux 可按自己的 shell 调整。
先选路线:新手机优先使用第9节的“服务器托管完整bootstrap、手机一条命令”入口;第3至7节保留为手工配置路线与原理说明。远端仍需已启用SSH并安装tmux,手机须先接通所需网络。两条路线不要叠加执行。 文中的主机别名、账号和密钥名均为中性示例。
在手机上安装工具:
pkg install openssh
确认当前 Bash 版本:
printf '%s\n' "$BASH_VERSION"
如果输出为空,当前不一定是 Bash,不要照抄 Bash 的 bind 或 shopt 到 zsh。
公开示例用 your-host.example 和 youruser 作占位,执行前换成真实地址和账号。如果远端只在 Tailscale 内可达,手机必须先连上自己的 Tailscale 网络;下面配置不会自动创建网络路由。

3. SSH key:手机留私钥,远端只装公钥

以下在手机 Termux执行:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_remote -C termux-client
ssh-copy-id -i ~/.ssh/id_ed25519_remote.pub youruser@your-host.example
遇到“文件已经存在,是否覆盖”时不要覆盖已有密钥。公钥复制这一步第一次通常仍需要远端账号密码。
推荐给私钥设置口令。账号密码与私钥口令是两件事:前者用于远端身份认证,后者用于本地解锁私钥。私钥不要上传博客、发聊天、放共享云盘,也不要复制到远端电脑。
先显式指定密钥测试:
ssh -i ~/.ssh/id_ed25519_remote youruser@your-host.example
第一次遇到主机指纹确认,应通过可信途径核对,不能为了省一步就关闭 host key 检查。
常见提示的含义:
  • Number of key(s) added: 1:公钥安装工具报告新增了一把公钥,之后仍应实际登录验证。
  • Enter passphrase for key ...:请求解锁私钥,不是在问远端账户密码。
  • (user@host) Password::这次尚未通过密钥完成免账号密码认证。
  • No command SSH found:命令大小写错误,应该输入小写 ssh。
  • No route to host:尚未到认证阶段,先检查地址、路由、VPN或防火墙,不要忙着重新生成密钥。

4. SSH 别名与连接保活

在手机的 ~/.ssh/config 中添加下面一段;如果同名条目已经存在,应编辑原条目,不要反复追加:
Host myserver
    HostName your-host.example
    User youruser
    IdentityFile ~/.ssh/id_ed25519_remote
    IdentitiesOnly yes
    ServerAliveInterval 30
    ServerAliveCountMax 6
chmod 600 ~/.ssh/config
ssh myserver
Host myserver 匹配的是命令里的 myserver。如果改成 ssh youruser@实际IP,这段专属配置通常不会被匹配,自定义命名的密钥也不一定自动选中。这是“明明装好了 key,怎么还要密码”的一个常见原因。
保活会定期探测服务器,也可能帮助避免空闲超时;它不会重建断掉的 TCP 连接,更不能阻止 Android 杀进程。
如果私钥有口令,在当前手机终端中启动 agent 并解锁:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519_remote
不要每次连接都重复启动一个 agent。这个简单做法作用于当前 shell 及其子进程;新窗口、App 被杀或手机重启后,不应假设仍然能使用原来的解锁状态。

5. tmux:断线后接回同一个工作现场

远端必须已经安装 tmux。没有安装时,可在使用Homebrew的Mac运行 brew install tmux;Debian/Ubuntu通常用 sudo apt install tmux。安装是远端管理员的明确操作,初始化脚本不会擅自代做。随后确认 tmux。Apple Silicon Mac 的 Homebrew 常见路径是下面这样,但 Intel Mac 和 Linux 路径可能不同:
command -v tmux
登录远端后运行下面两行,直接使用本机检测到的路径:
TMUX_BIN="$(command -v tmux)"
"$TMUX_BIN" new-session -A -s phone
-A 表示已有同名会话就接回,没有就创建。断线后重新执行同一条命令,即可回到保留的工作环境。
需要主动离开会话时,按 Ctrl+B,松开,再按 D。不要用 exit 结束本来想保留的 shell。
这次断线后,远端实际检查结果是:phone 会话还在,里面运行着 zsh,连接客户端为零。它证明会话保留生效,不证明 SSH 没断。屏幕上残留绿色状态栏,也不能当作连接存活证据。

6. 一条短命令:s-remote

把下面 alias 放进手机的 ~/.bashrc,先把 /ABSOLUTE/PATH/TO/tmux 替换成远端 command -v tmux 的实际结果。Apple Silicon Mac常见为 /opt/homebrew/bin/tmux,其他平台不要照抄这个路径:
alias s-remote="ssh -t myserver '/ABSOLUTE/PATH/TO/tmux new-session -A -s phone'"
让它立即生效:
source ~/.bashrc
s-remote
从此日常连接、断线重连都用 s-remote。alias 要写在手机上;如果写到远端 Mac,它不会凭空出现在手机的 shell 里。

7. 历史保存与前缀搜索,是两个独立设置

手机历史记录的是手机执行的 ssh、s-remote 等命令;SSH 里面输入的命令由远端 shell 记录。不要期待手机的 history 自动包含远端操作。

手机 Bash:命令结束后及时追加历史

下面简写适用于 Bash 5.1 及以上、尚未配置自定义提示符钩子的新环境,放入手机 ~/.bashrc。已有复杂hook的环境建议使用附录脚本的兼容实现,不要反复追加简写:
HISTFILE="$HOME/.bash_history"
HISTSIZE=10000
HISTFILESIZE=20000
shopt -s histappend
PROMPT_COMMAND+=('history -a')
这段手工配置只添加一次。history -a 在显示下一次提示符前追加本会话的新历史,降低 App 异常结束导致丢历史的概率;尚在执行的命令不保证已经落盘。不要直接覆盖已有 PROMPT_COMMAND,否则可能破坏原来的提示符钩子。配套安装脚本会处理重复加载和既有标量/数组配置。
touch ~/.bash_history
chmod 600 ~/.bash_history
历史文件可能包含误输入的敏感信息。密码应在交互提示中输入,不要把 token 当命令参数直接敲进去。

手机 Bash:输入前几个字母,再按上下键

同样放入手机 ~/.bashrc:
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
bind '"\eOA": history-search-backward'
bind '"\eOB": history-search-forward'
重新 source ~/.bashrc 后,把光标放在输入前缀末尾:
  • 输入 s- 再按上箭头,只寻找以 s- 开头的历史。
  • 输入 ssh 再按上箭头,只寻找以 ssh 开头的历史。
  • 连续向上寻找更早匹配,向下则返回较新的匹配。
  • 不输入前缀,仍可普通地浏览历史。
这里同时处理了常见的 CSI 和 SS3 方向键序列。Ctrl+R 则是另一种交互式历史搜索,可以继续使用。

远端 Mac zsh:另设一份按键绑定

放到远端的 ~/.zshrc,位于原有主题、插件和键位设置之后:
bindkey '^[[A' history-beginning-search-backward
bindkey '^[[B' history-beginning-search-forward
bindkey '^[OA' history-beginning-search-backward
bindkey '^[OB' history-beginning-search-forward
如果已有 tmux 会话仍运行旧 shell,仅修改文件不会自动更新它。可以在该 shell 直接执行这四行,不必重启整个 tmux 会话。本次已在远端备份后替换子串搜索绑定,并独立验证按键映射;没有终止用户正在运行的会话。

8. OPPO Find N6:后台设置能减少断线,但不能保证不断

OPPO 官方产品资料将 Find N6 的系统标为 ColorOS 16。OPPO 客服针对 ColorOS 12 及更新版本提供过“设置 → 应用 → 应用管理 → 具体应用 → 电池使用 → 允许后台活动”的通用指引;这不是 Find N6 专属菜单保证,地区和版本不同,建议用系统设置搜索“后台活动”定位。
手机上需要同时照顾 Termux 和 Tailscale,只给其中一个豁免可能不够。
建议逐项检查,而不是一次修改全部开关后宣称找到了原因:
  • 搜索系统设置里的“应用耗电管理/允许后台活动/电池优化”,确认两者没有被限制后台运行。
  • 搜索“后台数据/流量节省/不受限的数据使用”,检查后台联网权限;这与电池限制不是同一件事。
  • 若系统提供最近任务锁定或自启动管理,可作为补充;锁定任务不等于保证网络一直可用。
  • 切换目标如果是另一款使用 Android VPN 的代理应用,先检查它是否替换或断开 Tailscale 的 VPN。一般同一 Android 用户/工作资料中不能同时运行两个独立的 VPN 服务。
在手机端按需运行:
termux-wake-lock
不用时释放:
termux-wake-unlock
Wake lock 会增加耗电,也不是网络保活的无限保证。系统 Doze、厂商策略和 VPN 状态都可能影响结果。不能从“切 App 后断线”直接推导为“必定是电池优化”。
最简单的对照实验:保持同一 Wi-Fi,不熄屏,先切到普通备忘录,再回 Termux;观察 Tailscale 是否仍连接。然后单独测试熄屏,再单独测试网络切换。每次只改变一个条件,才有机会定位原因。
如果主要需求是跨 Wi-Fi/蜂窝漫游,Mosh 值得另行配置:它先用 SSH 启动远端,再通过 UDP 支持断网恢复;两端都要安装,网络也要允许相应 UDP。它与 tmux 互补,但不是所有 SSH 功能的替代品。本次没有安装或实测 Mosh,因此不把它写成已经完成的修复。

9. 真正的换机流程:服务器放好脚本,手机只运行一条命令

  • 服务端维护者提前放好一个完整、参数已经预置的单文件 bootstrap:目标主机、账号、密钥名、短命令和远端 tmux 路径都在部署时确定,不让新手机用户临时拼装。
  • 新手机安装可信来源的 Termux,并先接通所需网络;如果服务器只通过 Tailscale 可达,就先登录自己的 Tailscale 网络。
  • 在手机 Termux 本地运行下面一条命令:安装 OpenSSH,通过认证的 SCP 取回脚本,在手机上运行,成功后加载当前 shell 配置。不需要先下载 ZIP,也不用 SSH 进电脑逐条配置手机。
  • 配置成功后,用预设短命令连接或接回远端会话。下文仍用 s-remote 作为中性示例;实际自用入口可以保留自己的命名。
前置条件:远端已经启用 SSH、安装 tmux,并部署好完整 bootstrap;新手机还必须有首次下载所需的有效认证方式,例如允许使用的账户密码或已预置的密钥。若服务器禁用密码且手机尚无可用凭据,需先通过其他可信方式授权,脚本不能绕过下载前的认证。下面的 youruser、your-host.example 和 setup-phone.sh 是脱敏示例;实际使用时应由维护者提供已经填好的一整条命令,并记录到自己的 skill,下一次直接取用。不要把附录的基础配置核心简单改名,就当成完整 bootstrap。

© Ying Bun 2021 - 2026