用 5 美元/月的低配云服务器或树莓派跑 Claude Code 类编码 Agent,配置 systemd 守护进程实现后台常驻,通过 API 远程交互。
像 Claude Code 或 OpenCode 这样的编程 Agent 需要一台持续运行的机器。你不需要配置多么强大或昂贵的电脑。Agent 本身很轻量,因为重活是通过 API 完成的。一台 2 核 CPU、4 GB 内存的小型云服务器,每月大约 5 美元。你也可以用二手迷你 PC、树莓派,甚至是一台旧笔记本。
选一个你熟悉的 Linux 系统。Ubuntu 24.04 LTS 是个好选择,因为它稳定且支持良好。安装 Python、Git 和 Agent 软件。Agent 会要求提供 API key。获取 key 的方法是:在笔记本上打开浏览器,登录 Agent 网站,复制 key,然后粘贴到服务器的终端里。
启动一次 Agent 检查它是否正常工作。运行一个简单命令,比如 ./agent --version。Agent 应该会打印出版本号。然后关闭 SSH 会话。Agent 应该继续运行。如果它停了,就需要一种方式让它保持运行。systemd 或 tmux 这样的工具可以帮上忙。例如,创建一个 systemd 服务文件:
[Unit]
Description=Coding Agent
After=network.target
[Service]
User=agentuser
WorkingDirectory=/home/agentuser/agent
ExecStart=/usr/bin/python3 /home/agentuser/agent/agent.py
Restart=always
[Install]
WantedBy=multi-user.target
把文件保存为 /etc/systemd/system/agent.service。然后运行:
sudo systemctl daemon-reload
sudo systemctl enable agent
sudo systemctl start agent
现在 Agent 会在服务器启动时自动启动。如果它崩溃了,也会自动重启。
手机不是笔记本。它有诸多限制,使 SSH 难以使用。
屏幕会在几分钟后锁定。当屏幕锁定时,Android 可能会冻结或杀死后台应用。
网络经常切换。它会从 WiFi 切换到移动数据,或者从一个 WiFi 网络切换到另一个。每次切换都可能断开连接。
应用切入后台时会冻结。Android 这样做是为了省电。一个普通的 SSH 客户端在这种情况下会丢失会话。
常见的解决方法是 tmux。在服务器上安装它,启动一个 tmux 会话,在其中运行 Agent。如果连接断开,tmux 会保持进程存活。当你重新连接时,tmux 会把你重新拉回来。但 tmux 有问题:
你必须在每台使用的服务器上安装它。如果忘了,会话就会死掉。
你必须记得启动会话。如果不用 tmux 运行 Agent,连接断开时它就会停止。
tmux 有自己的命令体系。你必须学会它们才能用好它。
不借助 tmux 保持会话存活
一个小的辅助程序可以完成 tmux 做的事,但不需要配置。这个辅助程序叫 termphin-agent。它是一个 Rust 程序,Linux arm64 约 490 KB,Linux x86_64 约 540 KB。你通过 SSH 把它上传到服务器。它在后台运行,保持 shell 活跃。
它的工作原理如下:
你从手机发起一个 SSH 会话。
应用把辅助程序上传到服务器。它把辅助程序放到 ~/.termphin/agent。
辅助程序启动一个新的 shell。这个 shell 运行在辅助程序内部。
如果连接断开,辅助程序保持会话。它让 shell 保持存活。
当你重新连接时,辅助程序把你重新附加到同一个 shell。屏幕状态、光标位置和滚动内容都保留。
辅助程序是可选的。没有它,应用就是一个普通的 SSH 客户端。但有了它,你就不需要 tmux 了。
也有失败的情况。辅助程序可能崩溃或被杀死。如果服务器内存耗尽,Linux 内核可能会杀死辅助程序。如果服务器重启,辅助程序也会停止。为了处理这些情况,应用会在你重新连接时检查辅助程序是否在运行。如果辅助程序没有运行,应用会启动一个新的会话。
编程 Agent 会展示 diff、转圈动画、进度条和全屏文本界面。普通的 SSH 客户端往往不能正确处理这些。终端必须能正确渲染:
制表符字符。这些用于表格、菜单和边框。
颜色。这些用于语法高亮、diff 和状态消息。
光标移动。这用于转圈动画、进度条和交互式提示符。
如果终端没有正确渲染这些,输出就会看起来支离破碎。例如,diff 可能显示为一堵文字墙而不是对齐的行。转圈动画可能会跳来跳去而不是平滑旋转。
Termphin 使用一个真正的原生终端引擎。它由 Flutter 绘制,不是浏览器。这个引擎是 Dart 包 xterm 4.0.0 的分支。它基于 MIT 许可证开源。这意味着全屏文本用户界面程序可以正确渲染。
diff 可能很长。在手机上,你滑动查看。但终端必须保持行对齐。如果渲染有误,diff 就无法阅读。
下面是一个正常工作的 diff 示例:
--- old_file.txt
+++ new_file.txt
@@ -1,5 +1,5 @@
Line 1
-Line 2
+Line 2 updated
Line 3
Line 4
Line 5
- 和 + 符号必须对齐。颜色必须清晰。字体在小尺寸下必须可读。
为了让 diff 在手机上易读:
选择一种字体,如 Fira Code 或 JetBrains Mono。这些字体形状清晰、间距良好。
调整行高。1.2 到 1.4 的值效果不错。
调整内边距。4 到 8 像素的值可以让文字远离边缘。
使用在日光和夜间都能用的配色方案。例如 Solarized Dark 或 Gruvbox。
如果 diff 还是难以阅读,就放大。应用支持双指缩放。你也可以在设置里改变字体大小。
有些 Agent 会要求你按一个键来继续。例如:
The agent is ready. Press Enter to proceed.
在手机上,你没有物理键盘。一个带有特殊按键的工具栏会有帮助。工具栏有 Esc、Tab、Ctrl 和方向键。你可以点击这些按键而不是输入。
工具栏可以自定义。你可以保存不同的布局来应对不同的任务。例如:
一个用于编程 Agent 的布局。它有 Esc、Tab、Ctrl 和方向键。
一个用于普通 SSH 的布局。它有 Page Up、Page Down 和功能键。
打开工具栏设置。
点击 + 按钮添加新布局。
把按键从面板拖到工具栏。
工具栏可以悬浮或停靠。在竖屏模式下,它悬浮。在横屏模式下,它停靠到侧面。
Agent 可能要求你上传一个文件。例如:
Upload the config file to /home/user/config.yaml
在手机上,你从文件浏览器选择文件。应用把它上传到服务器,并把路径插入到提示符中。
文件浏览器是内置的。它的工作方式像本地文件管理器。你可以:
浏览服务器的文件系统。
预览图片、文本文件和代码。
在语法高亮编辑器中打开文件。
从手机上传文件到服务器。
从服务器下载文件到手机。
从应用打开文件浏览器。
导航到你想要上传文件的文件夹。
点击 + 按钮并选择上传。
从手机选择文件。
应用上传文件并显示路径。
编辑器支持多种语言的语法高亮。它也有行号和基本格式化功能。你可以编辑文件并保存回服务器。
你可能在多台服务器上运行同一个 Agent。与其每次都输入命令,不如把它保存为代码片段。代码片段是一个带名称的已保存命令。你可以在任何机器上一键运行它。
例如,保存一个名为 start_agent 的片段:
cd ~/agent && ./agent.py --config config.yaml
打开片段菜单。
点击片段名称。
应用把命令粘贴到终端并运行它。
应用会记住运行历史。它显示退出码和时间。如果命令失败,你可以看到原因。
你也可以编辑或删除片段。例如,修改配置文件路径或添加一个新的参数。
Agent 可能会在随机端口上启动一个开发服务器。例如,3000 端口上的 Web 服务器。要从手机访问它,需要设置一个隧道。隧道把手机上的一个本地端口转发到服务器的端口。
例如,把手机上的 8080 端口转发到服务器的 3000 端口:
打开服务器的配置。
进入 Tunnels 部分。
把 Local Port 设置为 8080,Remote Port 设置为 3000。
连接到服务器。隧道会自动启动。
现在在手机上打开浏览器,访问 http://localhost:8080。你应该能看到开发服务器。
你也可以动态创建隧道。例如,如果 Agent 在 4000 端口上启动了一个服务器,不需要编辑配置就能创建一个新隧道。
Agent 运行代码。它可能会犯错。设置限制来降低风险。
使用专用用户账户。不要用 root 运行 Agent。创建一个类似 agentuser 的用户,在该账户下运行 Agent。
设置内存限制。例如 2 GB。用 systemd 或 cgroups 来强制执行这个限制。
设置 CPU 限制。例如一个核心的 50%。这可以防止 Agent 用尽所有 CPU。
使用防火墙。只允许来自你 IP 的连接。例如,用 ufw:
sudo ufw allow from your.ip.address to any port 22
sudo ufw enable
经常检查日志。应用可以显示会话的最后几行。你也可以把会话记录到文件:
script -f /home/agentuser/session.log
然后在 script 内运行 Agent。日志文件会记录一切。
使用 SSH 密钥而不是密码。应用把密钥存储在手机上加密的保险库里。保险库受 PIN 或指纹保护。
验证主机密钥。应用在连接前检查服务器的主机密钥。如果密钥不匹配,它会直接失败。你可以在设置中固定密钥。
我构建了 Termphin,一个用于 Android 的 SSH 客户端,来解决这些问题。它是一个原生应用,不是 WebView 或浏览器包装器。终端引擎是 Dart 包 xterm 4.0.0 的分支。它基于 MIT 许可证开源。Android 应用本身不开源。
Termphin 无需 tmux 就能保持会话存活。一个小的辅助程序在服务器上运行,保持会话。如果连接断开,辅助程序保持 shell 存活。当你重新连接时,辅助程序把你精确地重新附加到离开时的位置。辅助程序是可选的。没有它,应用就是一个普通的 SSH 客户端。
终端能正确渲染编程 Agent。它处理 diff、转圈动画和全屏文本界面。你可以调整字体、大小、行高、内边距和配色方案。应用有八种配色方案,支持亮色和暗色主题。
应用有内置的 SFTP 文件浏览器。你可以浏览服务器的文件系统、预览文件,并在语法高亮编辑器中编辑它们。你可以从手机上传文件到服务器,也可以从服务器下载文件到手机。
你可以把命令保存为片段,在任何机器上运行。你可以设置隧道来访问开发服务器。应用支持跳板主机、端口转发和用于 2FA 的 keyboard-interactive 认证。
该应用在 Android 上目前免费。这个版本没有广告也没有应用内购买。iOS、Windows、macOS 和 Linux 客户端正在开发中,但尚未发布。
在服务器上运行编程 Agent,并从手机上查看,是可行的。难点在于手机。会话必须经受住屏幕锁定、网络切换或应用切入后台。终端必须正确渲染 diff、转圈动画和全屏界面。应用必须让你能发送文件、运行已保存的命令,以及通过隧道访问开发服务器。
有了正确的设置,你可以启动一个长时间运行的任务,然后随时查看。Agent 保持存活,终端正常工作,手机不会成为障碍。