SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 更新于 2026-08-27

如何在手机上使用 Claude Code

Claude Code 运行在 VPS 的 tmux 会话中,手机仅通过 SSH 查看终端。本文介绍 SSH 密钥、应对移动网络波动的 mosh、tmux attach,以及手机键盘按键栏的实用设置。

通过手机使用 Claude Code:实际工作方式

通过手机使用 Claude Code 并不是使用移动应用。Claude Code 运行在 VPS(虚拟专用服务器)上的 tmux 会话中。手机会通过 SSH(安全 Shell)连接到该会话,并在您查看会话期间保持连接。即使关闭应用,代理仍会继续工作,因为该进程从未运行在手机上。

这部分拆分方式就是整个设计的核心。手机操作系统会在您切换到其他应用几秒后暂停当前应用,因此在手机上启动的长时间任务会停止。您从 Wi-Fi 切换到移动数据时,手机还会获得新的网络地址。将进程放在服务器上运行、让手机只显示终端界面后,这两个问题都会消失。

您需要在服务器上准备 4 项内容:用于保持会话的 tmux、用于登录的 SSH 密钥、用于应对网络变化的 mosh,以及 Claude Code 本身。手机端只需要安装一个带有可访问按键栏的终端应用。

VPS 所需配置

对于 SSH 和 tmux 部分,一台小型 Ubuntu 24.04 服务器就足够了。Claude Code 的要求更高。截至 2026 年 7 月,官方要求是在 x64 或 ARM64 处理器上运行 Ubuntu 20.04 或更高版本,并配备至少 4 GB RAM。1 GB 方案可以完成安装,但在负载升高时,内核会终止该进程。Claude Code 还需要付费的 Claude 账户(Pro、Max、Team 或 Enterprise),或具备 API 访问权限的 Console 账户,因为免费的 Claude.ai 方案不包含此功能。

请使用带 sudo 权限的普通用户配置服务器,不要使用 root。如果服务器是新建的,请先完成新 VPS 的前十分钟,因为完成用户和防火墙配置后,本指南后面的 SSH 修改会更容易。

sudo apt update && sudo apt install -y tmux mosh
curl -fsSL https://claude.ai/install.sh | bash
claude --version

安装程序会将二进制文件放在 ~/.local/bin/claude,而 claude --version 会输出类似 2.1.211 (Claude Code) 的一行。如果输出 command not found,说明该目录尚未加入你的 PATH:退出登录后重新登录,再使用 command -v claude 检查。claude doctor 会输出安装和设置诊断信息,但不会启动会话。

现在先从笔记本电脑登录一次,再依赖手机操作。在项目目录中运行 claude,然后按照登录提示操作。该流程会要求你在浏览器中打开一个 URL,再将代码带回终端;在手机屏幕上切换两个应用完成这些操作很慢。请先使用实体键盘完成一次登录,凭据就会保留在服务器上。

在 tmux 中启动 Claude Code,防止连接断开终止进程

tmux new -s claude
cd ~/projects/api
claude

使用 Ctrl-b,然后使用 d 分离会话。tmux 会输出 [detached (from session claude)],并将您返回 shell。现在,您可以关闭应用、失去网络信号,或将手机放入口袋。窗格中的进程仍会继续运行。

tmux ls
tmux attach -t claude

tmux ls 会为每个会话输出一行,例如 claude: 1 windows (created Thu Jul 30 09:14:02 2026)tmux attach -t claude 会将您准确带回离开的位置,包括尚未完成的编辑。

这是因为 tmux 会运行自己的服务器进程。您的 shell 和 Claude Code 是该服务器的子进程,而不是 sshd 的子进程。SSH 连接结束时,内核会向附加到该连接的进程发送挂断信号 SIGHUP;tmux 服务器不属于这些进程。如果不使用 tmux,同样会导致连接断开的锁屏操作,也会使 Claude Code 在工具调用过程中停止。在 VPS 的 tmux 中运行 Claude Code 更详细地介绍了会话布局。

请在服务器上运行 tmux,不要在手机上运行。在已经附加的会话中输入 tmux 会输出 sessions should be nested with care, unset $TMUX to force;强制执行会导致两个前缀键相互冲突。

每次登录时自动连接

在触摸键盘上输入连接命令很快就会变得麻烦。将以下内容添加到服务器上的 ~/.profile 末尾:

if command -v tmux >/dev/null 2>&1 && [ -z "$TMUX" ] && [ -t 1 ]; then
  exec tmux new-session -A -s claude
fi

如果名为 claude 的会话存在,new-session -A -s claude 会连接到该会话;如果不存在,则创建该会话。因此,一条命令即可处理这两种情况。exec 会用 tmux 替换登录 shell,因此退出 tmux 后连接会关闭,而不是返回一个普通的 shell 提示符。需要使用普通 shell 时,跳过此文件:ssh you@server -t "bash --noprofile"

将其写入 ~/.profile,不要写入 ~/.bashrc~/.bashrc 也会在非交互式会话中执行,因此文件传输会中断:scpsftp 会将意外输出当作协议数据读取,并因 Received message too long 而失败。~/.profile 仅对登录 shell 执行,这正是交互式 SSH 会话所使用的 shell。

~/.profile 也是 Ubuntu 将 ~/.local/bin 添加到 PATH 的位置。如果登录后立即执行 claude 正常,但 tmux 内的 shell 显示 command not found,原因就是执行顺序。因此,应像上面这样从登录 shell 启动 tmux,而不要从跳过 profile 的脚本启动。

这两个应用都支持 SSH 和 mosh,也都将密钥存储在应用中。区别在于操作界面。

Blink Shell 以命令为主。在提示符中输入 ssh you@servermosh you@server,语法与桌面终端相同。输入 config 打开设置,Keys 部分会为您创建密钥对。

Termius 以表单为主。您先填写主机条目,然后在主机详情中将该主机从 SSH 切换为 Mosh。Termius 自带 mosh 实现,并支持 mosh 1.3.0 及更高版本,因此服务器仍需安装 mosh 软件包。

无论使用哪个应用,都应在应用内生成密钥,绝不要将现有私钥复制到手机上。应用会显示公钥部分,您只需将这一行添加到服务器上的 ~/.ssh/authorized_keys为每台设备使用独立的 SSH 密钥并撤销密钥介绍了命名和撤销步骤。对于手机,这比笔记本电脑更重要。

启用终端应用自身的生物识别或密码锁定功能。否则,只要屏幕保持唤醒状态,一部已解锁的手机就等同于在服务器上打开的 shell。

Android:Termux

pkg upgrade
pkg install openssh mosh
ssh-keygen -t ed25519 -C "pixel"
cat ~/.ssh/id_ed25519.pub

Termux 在自己的软件源中提供 OpenSSH 和 mosh,因此 sshssh-keygenmosh 的行为与桌面系统相同。将显示的公钥行添加到服务器上的 ~/.ssh/authorized_keys,然后使用 mosh you@server 连接。

Android 屏幕键盘没有 Esc 键和 Ctrl 键,而 Claude Code 需要这两个键。Termux 可以绘制自己的按键行。在 ~/.termux/termux.properties 中添加一行:

extra-keys = [['ESC','|','/','HOME','UP','END','PGUP'],['TAB','CTRL','ALT','LEFT','DOWN','RIGHT','PGDN']]

然后运行 termux-reload-settings,按键行就会显示在键盘上方。同样的重新加载操作也会加载放置在 ~/.termux/font.ttf 中的等宽 TrueType 字体。

Termux 在后台运行时,Android 可能会将其停止。这里最多只需重新连接。会话和代理都在服务器上。

离开 Wi-Fi 后终端为什么会卡住?mosh 解决了什么问题?

SSH 连接使用 TCP(传输控制协议),TCP 连接由两端的地址和端口共同标识。离开 Wi-Fi 覆盖范围后,手机会从移动网络获得新地址,因此旧连接在两端都无法匹配。系统不会对此发出通知。终端只会停止响应,直到 TCP 放弃连接,随后 ssh 输出 client_loop: send disconnect: Broken pipe。要立即终止冻结的会话,请依次按下 Enter~.

mosh(移动 shell)消除了这种故障模式。它先使用 SSH 登录并启动一个 mosh-server 进程,读取服务器选择的 UDP(用户数据报协议)端口,然后关闭 SSH 连接。之后,两端使用共享会话密钥对 UDP 数据报进行身份验证,因此会话由该密钥而不是地址标识。地址变化后,会话可以继续使用。mosh 还会在本地回显输入,并在服务器状态不一致时重新绘制屏幕,因此在速度较慢的移动网络上仍然可用。

mosh 使用 60000 到 61000 之间的 UDP 端口,因此请开放此端口范围:

sudo ufw allow 60000:61000/udp
sudo ufw status

使用 ufw 开放端口介绍了防火墙配置的其余内容。如果服务提供商在控制面板中提供独立的网络防火墙,也应在那里添加相同的端口范围,因为 ufw 规则无法影响位于服务器前端的过滤器。

mosh 常见的两种故障如下。登录成功后卡住,并显示 Nothing received from server on UDP port 60001.,表示手机与服务器之间的某处阻止了该 UDP 端口范围。连接报告未找到 mosh-server,表示服务器上未安装该软件包,或登录 PATH 中未包含它。请安装该软件包,或使用 mosh --server=/usr/bin/mosh-server you@server 直接指定其路径。

登录区域设置不是 UTF-8 时,mosh 也会拒绝运行,并显示:mosh-server needs a UTF-8 native locale to run. 请在服务器上修复区域设置,不要在手机上修改。

locale
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8

mosh 有两项功能限制。其 README 明确说明,mosh 不支持 X 转发,也不支持 SSH 的非交互式用途,包括端口转发。因此,要预览 Claude Code 刚启动的 Web 应用,仍需使用普通的 ssh -L 8080:127.0.0.1:8080 you@server。mosh 还只同步当前可见的屏幕,因此自身没有回滚缓冲区。这里第二项限制没有影响,因为 tmux 会保留回滚内容:Ctrl-b,然后 [ 进入复制模式;拖动鼠标或使用箭头键滚动;按 q 退出。

让手机屏幕更易用

服务器上的 ~/.tmux.conf 中有 4 行配置负责大部分工作:

set -g mouse on
set -g status-position top
set -g default-terminal "tmux-256color"
set -g history-limit 20000

mouse on 会将触摸拖动转换为滚动,将点击转换为窗格或窗口选择。这样可以替代大多数难以输入的前缀键。status-position top 会将 tmux 状态栏移到底部边缘之外,避免它被屏幕键盘及其建议栏遮挡。default-terminal 很重要,因为否则 tmux 会向 Claude Code 声明自己是 screen 终端,颜色和框线显示效果会变差。如果 tmux 随后因 missing or unsuitable terminal: tmux-256color 而无法启动,则表示缺少 terminfo 条目:sudo apt install ncurses-term

掌握 4 个按键后,其余操作都会更顺手。

  • Esc 会中断 Claude 当前的响应,同时保留已经完成的工作。因此应将它放在拇指最容易按到的位置。
  • Ctrl+C 也会中断正在运行的操作。在空闲提示符处,第一次按下会清除输入,第二次按下会退出 Claude Code,因此它的作用更强。
  • 连按两次 Esc 会清除草稿提示;在空提示符处,它会改为打开回退菜单。
  • 对于多行提示,请输入 \,然后按 Enter。这种方式在所有终端中都有效。Shift+Enter 仅在少数桌面终端中原生支持,移动端客户端不在其中。

避免使用拆分窗格。手机竖屏时宽度通常约为 40 列,因此垂直拆分后每个窗格只有 20 列,所有差异内容都会换行成难以阅读的杂讯。改用 tmux 窗口:Ctrl-b c 会创建一个新窗口,Ctrl-b n 会切换到下一个窗口。如果第二个窗口中运行了独立的 Claude Code 会话,两个会话可以直接相互交接工作,无需在触摸屏上的窗口之间复制文本。需要仔细阅读差异内容时,请将手机横过来。

有意设置显示在屏幕上的文本量很有必要,因为 输出样式会编辑每条回复背后的系统提示,而更简洁的样式意味着在手机上需要滚动查看的屏幕内容更少。

在小屏幕上运行长时间会话,主要问题是上下文管理。因此,在尝试从火车上完成一整天的工作前,建议先阅读管理 Claude Code 上下文窗口

仅使用密钥,不使用密码

手机现在持有一把可访问这台机器的密钥,而这台机器可以编辑代码并运行命令。关闭密码认证。使用 drop-in 文件比直接编辑 sshd_config 更安全,因为 Ubuntu 的 sshd_config 会在顶部包含 /etc/ssh/sshd_config.d/*.conf,而配置项使用首次找到的值。

sudo tee /etc/ssh/sshd_config.d/99-phone.conf >/dev/null <<'EOF'
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
EOF
sudo sshd -t && sudo systemctl reload ssh

sshd -t 会解析配置。配置有效时不会输出任何内容。跳过这一步后,一个拼写错误就会导致 sshd 重新加载失败。保留当前会话处于打开状态,并在关闭任何会话前通过第二个连接进行测试,因为错误的密钥现在会导致 Permission denied (publickey).,而关闭密码后没有备用登录方式。此时的恢复路径是使用服务提供商的控制台。如果测试连接确实失败,请使用 ssh -v 重新连接,并在第一个会话仍处于打开状态时处理问题,因为这一条错误消息可能对应五种不同故障,而详细输出会告诉您具体是哪一种。

为每台设备使用独立的密钥。这样手机丢失后,只需从 ~/.ssh/authorized_keys 删除一行,笔记本电脑仍可继续使用。使用一个共享密钥,则需要在您拥有的每台设备上更换密钥。

如果您在 Ubuntu 24.04 上将 SSH 移到其他端口,请注意监听器属于 ssh.socket,因此单独添加 Port 行不会产生任何效果。运行 sudo systemctl edit ssh.socket,使用空的 ListenStream= 清除默认值,然后在下一行设置端口。在 VPS 上加固 SSH介绍了这一配置以及其他攻击面。

用于 SSH 的 fail2ban在关闭密码后几乎不会增加安全性,因为系统根本不会接受猜测出的密码。它能带来的作用是减少日志噪声,从而更容易发现真实的登录尝试。

更安全的做法是让 SSH 不暴露在公网中。将服务器置于由您自行托管的 WireGuard VPN后面,按需在手机上建立隧道,并仅在该隧道上为 sshd 分配 ListenAddress。mosh 可通过该隧道工作,因为两端都使用 UDP。需要注意的是,隧道会增加数据包开销。因此,如果大文件传输停滞,请在手机的 WireGuard 配置中降低 MTU(最大传输单元)。

最后说明一种通过手机工作的注意事项。您会在一次只能显示几行差异的屏幕上批准权限提示。这正是应保留防护措施、而不是将其关闭的原因。还要检查会话启动时使用的权限模式,因为auto mode 将在 14 August 2026 成为 Claude Code 的默认模式,并且它会直接执行文件编辑而不会停下来征求您的同意。在 VPS 上安全运行 Claude Code介绍了在主要入口是触摸屏时,值得设置的用户和目录限制。

重新连接后发现异常

tmux attach 输出 no server running on /tmp/tmux-1000/default 表示 tmux server 已退出,这通常意味着机器重启过。使用 uptime 检查。自动安全更新安装内核更新时会重启机器;机器重启后不会保留 tmux session,因此应将任何 Claude Code 运行都视为可重新启动的任务。

can't find session: claude 的情况不同。tmux server 正在运行,但不存在该名称。tmux ls 会显示当前存在的 session。

如果重新连接后看到的是普通 shell 提示符,而原先运行 Claude Code 的位置已经没有它,说明进程已结束,但 session 仍然存在。检查 dmesg -T | tail,查找类似 Out of memory: Killed process 4821 (claude) 的行。内存低于 4 GB 要求的机器在执行大型编辑时可能出现该情况。如果没有这类行,说明 Claude Code 自行退出;提示符上方的 shell 滚动历史中会保留退出原因。

如果窗口重新打开后变得很小,周围留有未使用的空间,说明有两个客户端以不同尺寸连接,因为 tmux 会将窗口调整为适应已连接客户端中的最小尺寸。您的笔记本电脑仍以 200 列宽保持该 session,而手机要求宽度为 40 列。连接时让其他客户端分离:tmux attach -d -t claude

FAQ

我可以直接在手机上运行 Claude Code,而不是在 VPS 上运行吗?

不可以。截至 2026 年 7 月,支持的平台包括 macOS、Windows、Ubuntu 20.04 或更高版本、Debian 10 或更高版本,以及 Alpine 3.19 或更高版本,并且需要 4 GB 或更多 RAM。Android 和 iOS 不在支持列表中。手机还会让应用进入休眠状态,并持续更换网络地址,这些情况都无法满足长时间运行代理的要求。请在服务器上运行 Claude Code,并将手机用作显示终端。

关闭应用或失去信号后,会话还会保留吗?

会,而且有两个独立组件负责这项工作。tmux 会让进程继续在服务器上运行,因此连接断开时任务不会终止。mosh 会在网络地址变化时保持连接,因此从 wifi 切换到移动数据时甚至不需要重新连接。只使用普通 SSH 而不使用 tmux 时,连接断开会发送 SIGHUP,Claude Code 会在任务进行到一半时停止。

为什么 mosh 连接成功后却没有任何显示?

如果登录成功后停滞,并显示 Nothing received from server on UDP port 60001.,说明 UDP 60000 到 61000 未开放。请在 ufw 中添加此端口范围,并在服务提供商的网络防火墙中再次添加。大多数控制面板将网络防火墙作为独立的控制项。如果 mosh 报告找不到 mosh-server,说明服务器缺少该软件包:sudo apt install mosh

没有 Esc 键时,如何使用键盘中断 Claude Code?

添加一行按键。Termux 可在 ~/.termux/termux.properties 中使用 extra-keys 配置按键行,Termius 和 Blink 也都提供可在设置中编辑的按键行。Esc 可中断正在运行的响应,同时保留已经完成的工作。Ctrl+C 也可以中断响应,但在空闲提示符下连续按两次会退出 Claude Code,因此应优先使用 Esc

将 SSH 暴露到互联网是否足够安全?

关闭密码认证后,唯一可能成功的凭据就是永远不会离开设备的密钥。对于可以重装的服务器而言,这属于合理风险。请为每台设备使用独立密钥,这样手机丢失时,只需从 authorized_keys 中删除一行。如果您不想在公网端口上提供 SSH,可以将服务器置于 WireGuard 后面,并让 sshd 监听隧道地址。