如何在手机上使用 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 年 10 月,官方要求为 Ubuntu 20.04 或更高版本、x64 或 ARM64 处理器,以及至少 4 GB RAM。1 GB 规格的服务器可以完成安装,但在负载升高时,进程会被内核终止。Claude Code 还需要付费 Claude 账户(Pro、Max、Team 或 Enterprise)、具有 API 访问权限的 Console 账户,或通过 Amazon Bedrock 等受支持的云服务商使用,因为免费的 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 claudetmux 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 也会在非交互式会话中执行,因此文件传输会中断:scp 和 sftp 会将意外输出当作协议数据读取,并因 Received message too long 而失败。~/.profile 仅对登录 shell 执行,这正是交互式 SSH 会话所使用的 shell。
~/.profile 也是 Ubuntu 将 ~/.local/bin 添加到 PATH 的位置。如果登录后立即执行 claude 正常,但 tmux 内的 shell 显示 command not found,原因就是执行顺序。因此,应像上面这样从登录 shell 启动 tmux,而不要从跳过 profile 的脚本启动。
iOS:Termius 或 Blink Shell
这两个应用都支持 SSH 和 mosh,也都将密钥存储在应用中。区别在于操作界面。
Blink Shell 以命令为主。在提示符中输入 ssh you@server 或 mosh 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.pubTermux 在自己的软件源中提供 OpenSSH 和 mosh,因此 ssh、ssh-keygen 和 mosh 的行为与桌面系统相同。将显示的公钥行添加到服务器上的 ~/.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.,表示 mosh-server 已启动,但客户端无法通过该 UDP 端口连接到它。这通常表示手机与服务器之间的某个防火墙阻止了 mosh 端口范围内的 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两端都需要使用 UTF-8 区域设置,mosh-server 还会应用客户端发送的区域设置。如果修复服务器后错误仍然存在,请在手机终端应用中将 LANG 设置为 UTF-8 值;mosh 自己的 FAQ 也指出,mosh-client 可能需要这样设置。
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 20000mouse 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 sshsshd -t 会解析配置;配置有效时不输出任何内容。跳过这一步后,只要有一个拼写错误,sshd 就会在重新加载时失败。请保持当前会话打开,并从第二个连接进行测试后再关闭任何会话,因为错误的密钥现在会导致 Permission denied (publickey).,而禁用密码后没有备用登录方式。此时的恢复路径是使用服务提供商的控制台。如果测试连接确实失败,请使用 ssh -v 重新连接,并在第一个会话仍然打开时排查问题,因为这一条错误消息可能对应五种不同故障,而详细输出会告诉您具体是哪一种。
为每台设备使用独立的密钥。手机丢失后,只需从 ~/.ssh/authorized_keys 删除一行,笔记本电脑仍可正常使用。使用一个共享密钥,则需要在您拥有的每台设备上更换密钥。
如果您在 Ubuntu 24.04 上将 SSH 迁移到其他端口,请注意监听器属于 ssh.socket。systemd generator 会根据 SSH 配置中的 Port 行创建该套接字,因此不需要 ListenStream 覆盖配置;但单独重启 ssh 会使服务器继续监听 22 端口。将 Port 行放入 drop-in,允许 ufw 放行新端口,然后运行 sudo systemctl daemon-reload,再运行 sudo systemctl restart ssh.socket。加固 VPS 上的 SSH介绍了这些步骤以及其他攻击面。
用于 SSH 的 fail2ban在禁用密码后增加的安全性很小,因为猜出的密码根本不会被接受。它带来的作用是减少日志噪声,从而更容易发现真正的登录尝试。
更安全的做法是让 SSH 不暴露在公网中。将服务器置于您自行托管的 WireGuard VPN之后,按需在手机上建立隧道,并只在该隧道上为 sshd 配置 ListenAddress。mosh 可以通过该隧道工作,因为两端都使用 UDP。需要注意的是,隧道会增加数据包开销,因此如果大文件传输停滞,请在手机的 WireGuard 配置中降低 MTU(最大传输单元)。
最后说明一种需要注意的工作方式。使用手机时,您会在一次只显示几行差异的屏幕上批准权限提示。这正是应保留防护措施、而不是关闭它们的理由。还应检查会话启动时使用的权限模式,因为从 Claude Code v2.1.283 开始,auto 模式已成为交互式终端会话内置的默认启动模式,它会直接修改工作目录中的文件,而不会停下来询问您。在 VPS 上安全运行 Claude Code介绍了在主要入口采用触摸屏之前,值得设置的用户和目录限制。
重新连接后发现异常
tmux attach 输出 no server running on /tmp/tmux-1000/default,表示 tmux 在该 socket 上没有找到服务器。通常是服务器已退出,这几乎总是因为机器重启。使用 uptime 检查。如果机器没有重启,而 pgrep tmux 仍显示存在服务器,则说明 socket 文件已被删除;pkill -USR1 tmux 会让服务器重新创建该文件。自动安全更新中的内核更新会重启机器,而重启后的机器不会保留 tmux 会话,因此应将任何 Claude Code 运行视为可重新启动的任务。
can't find session: claude 的情况不同。tmux 服务器正在运行,但不存在该名称。tmux ls 会显示当前存在的会话。
如果连接后看到的是普通 shell 提示符,而原本这里运行的是 Claude Code,说明进程已结束,但会话仍未结束。查看 dmesg -T | tail,寻找类似 Out of memory: Killed process 4821 (claude) 的行。低于 4 GB 要求的机器在执行大型编辑时可能会出现此情况。如果没有这样的行,说明 Claude Code 自行退出了;提示符上方的 shell 滚动历史中通常包含原因。
窗口重新出现时尺寸很小,周围有未使用的空间,表示两个客户端以不同尺寸连接,因为 tmux 会按照已连接客户端中最小的尺寸调整窗口。你的笔记本仍以 200 列宽保持会话,而手机只请求 40 列。连接时分离其他客户端:tmux attach -d -t claude】【。
FAQ
我可以直接在手机上运行 Claude Code,而不是在 VPS 上运行吗?
不可以。截至 October 2026,支持的平台包括 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 端口访问 mosh-server。通常是防火墙阻止了 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 监听隧道地址。