一台主机运行多个 Claude Code Remote Control:Linux user、systemd 与 git worktree 分工
Claude Code 多个 Remote Control 运行在同一台主机:信任边界不同就分 Linux user,每个环境一个 systemd service,同一个 repo 的开发和写文章用 git worktree 分开,并说明 --spawn=worktree 的限制。
本文目录
我在 2026 年 10 月把几个项目的 Claude Code Remote Control 都放在 Oracle 的 Ubuntu ARM 主机上,用 systemd 常驻,手机的 Claude App 里能看到开发、内容、后台服务三个环境。这篇整理 Claude Code 多个 Remote Control 放在同一台主机时,用户、服务和工作目录怎么分。
先说结论:每个环境一个 systemd user service;信任程度不同的项目分给不同的 Linux 用户;同一个 repo 要同时做功能开发和写文章,用 git worktree 开第二个工作目录,不用另开 repo。 --spawn=worktree 分开的是工作目录,不是权限;要真正隔离,靠的是不同 Linux 用户、独立凭据和 GitHub 最小权限。
本文是我 2026 年 10 月的部署记录与整理,项目和用户名称都换成了
project-a这类示例。Claude Code Remote Control 的参数以官方文档为准(2026 年 10 月 12 日查阅):需要 Pro、Max、Team 或 Enterprise 套餐,不支持 API key;Team 和 Enterprise 要由 Owner 在管理设置中开启。文中的做法不保证服务永远在线。
Claude Code 多个 Remote Control:先决定要不要分 Linux 用户
| 做法 | 优点 | 缺点 | 适合 |
|---|---|---|---|
| 每个项目一个 Linux 用户 | 各自的 ~/.claude/、SSH key、GitHub 授权、systemd 服务,权限容易分开 |
每个用户都要各自登录 Claude、设置 GitHub | 生产环境、数据库等高风险项目 |
| 同一个用户、不同 repo 或 worktree | 共用 Claude 登录和 GitHub CLI 授权,设置一次即可 | 没有操作系统层面的隔离,一个 session 读得到其他项目的文件 | 同一个人的多个低风险项目、同一 repo 的不同工作 |
systemd 的 NoNewPrivileges=true 这类设置也不是完整的沙箱,共用同一个 Linux 用户的 Remote Control 仍然可能互相读写对方能访问的文件。
创建项目用户并开启 linger(让服务不依赖登录):
sudo adduser --disabled-password --gecos '' project-a
sudo loginctl enable-linger project-a
loginctl show-user project-a -p Linger
每个新用户都要各自安装、登录 Claude Code,GitHub 的 SSH key 和 API 授权也要各自设置。读 Issue 需要的 API 授权,见《Git 可以 push,Claude Code 却读不到 GitHub Issues》。不要把别的用户的 ~/.claude/ 登录数据直接复制过来。
同一个 repo:用 git worktree 开内容专用的工作目录
我的情况是同一个网站 repo,想让一个 Remote Control 专心改代码、另一个专心写文章和做 SEO。做法是用 git worktree 从同一个 repo 开第二个工作目录,放在它自己的分支上。
# 在拥有 repo 的 Linux 用户下
cd ~/projects/project-a
git status -sb
git fetch origin
# 先确认分支是否已经存在
git branch --list 'content/editorial'
git branch -r --list 'origin/content/editorial'
# 只在 content/editorial 还不存在时执行
git worktree add -b content/editorial ~/projects/project-a-content origin/main
git worktree list
几条规则(git worktree 官方说明):
-b会从指定的起点创建新分支,并在新的 worktree 检出。分支已经存在时,-b会拒绝创建。 这时改用git worktree add <路径> <既有分支>,不要硬加-b。- 同一个分支不能同时在两个 worktree 检出,Git 默认会拒绝。
- 新的 worktree 和原来的 repo 共用对象库和 refs,只有
HEAD、index 这类文件是各自的。
为什么不用 cp -r 复制一份?复制会连 .git 一起复制,变成两个各自独立的 repo,之后同步和分支关系都更难管理;worktree 共用同一个 Git 数据库,在哪个分支一目了然。
每个环境一个 systemd 服务
每个 Remote Control 一个 systemd user service,工作目录、显示名称各自设置。以内容用的 worktree 为例,在 project-a 用户下创建 unit 文件:
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/claude-project-a-content.service <<'SERVICE_UNIT'
[Unit]
Description=Claude Code Remote Control - Project A Content
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
WorkingDirectory=/home/project-a/projects/project-a-content
ExecStart=/home/project-a/.local/bin/claude remote-control --name "VM1 - Project A - Content" --spawn=worktree
Restart=on-failure
RestartSec=15
Environment=HOME=/home/project-a
Environment=PATH=/home/project-a/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MemoryHigh=2500M
MemoryMax=3500M
NoNewPrivileges=true
UMask=0077
[Install]
WantedBy=default.target
SERVICE_UNIT
tail -n 4 ~/.config/systemd/user/claude-project-a-content.service
MemoryHigh、MemoryMax是每个服务各自的上限,不是整台主机的总量。多个服务同时运行时,要根据主机实际内存调整。- 写完先确认文件末尾有
[Install]。我遇到过 heredoc 没有正确收尾、文件少了一段的情况。
第一次启动前,先切换到这个用户、进入工作目录手动运行一次 ~/.local/bin/claude remote-control --name "..." --spawn=worktree。第一次会问 Enable Remote Control? (y/n),看到 Connected 并在手机或网页上确认环境出现后,按 Ctrl+C 结束,再交给 systemd。
接着回到管理员账号启用服务。直接在 sudo -iu 的 shell 里执行 systemctl --user 可能出现 No medium found,要从管理员账号指定 user bus:
PROJECT_USER=project-a
uid=$(id -u "$PROJECT_USER")
sudo -u "$PROJECT_USER" \
XDG_RUNTIME_DIR="/run/user/$uid" \
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$uid/bus" \
systemctl --user daemon-reload
sudo -u "$PROJECT_USER" \
XDG_RUNTIME_DIR="/run/user/$uid" \
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$uid/bus" \
systemctl --user enable --now claude-project-a-content.service
原因和完整说明见《systemctl –user 出现 No medium found 怎么办》。新增、重启服务时只动要处理的那一个,不要一次重启全部,以免中断其他环境正在进行的工作。
官方文档也提到,server mode 下网络中断约 10 分钟后,claude remote-control 进程会结束,需要重新启动。Restart=on-failure 会不会把它拉起来,取决于进程结束的方式,要看 journal 确认,不要假设 systemd 能处理所有断线或登录失效。
名称:–name、服务名称和对话标题是不同层次
| 层次 | 在哪里设置 | 用途 |
|---|---|---|
| Remote Control 环境名称 | --name 参数 |
在 claude.ai/code 和 Claude App 的环境列表里显示 |
| systemd 服务名称 | unit 文件的文件名 | 在主机上管理、看日志 |
| 对话标题 | Claude App 或网页里的每个 session | 区分单次工作 |
| Git 分支 | git worktree add、git switch |
决定修改落在哪里 |
建议固定一套命名规则,例如“主机 - 产品 - 角色”:VM1 - Project A - Development、VM1 - Project A - Content,服务名称对应为 claude-project-a.service、claude-project-a-content.service。手机上看到哪个环境,就知道该去主机上哪个服务看日志。
我当时在手机上看到三个环境,担心是不是有人改了名字。在 App 里改显示名称,一般不会改到 Git repo、分支或 unit 文件;但服务重启后名称怎么显示,要用当前的 Claude Code 版本实际确认,我不保证会保留新名称或恢复旧名称。
–spawn=worktree 与 –capacity:要注意的事
根据官方文档,--spawn 有 same-dir、worktree、session 几种模式。worktree 模式下,每个按需创建的 session 都有自己的 git worktree,所以工作目录必须是 git repo。--capacity 是同时 session 的上限,默认 32。我部署时,服务日志出现过 Capacity: 1/32 · New sessions will be created in an isolated worktree;那是当时的输出,不代表每个套餐或版本都一样。
三个常见的误会:
-
看错工作目录:新 session 在自己的 worktree 里,不一定在你创建的
content/editorial。开工前先确认:pwd && git status -sb && git worktree list -
以为已经上线:commit 到分支不等于合并、部署。要确认 PR、CI 和部署状态。
-
以为不同 session 不会冲突:两个 Claude 仍然可能改到同一段代码或同一篇文章。事先分清文件归属,用 PR 审核合并。
--spawn=worktree 不是操作系统层面的隔离。同一个 Linux 用户下的 session,权限都一样。
三个环境怎么分工
我的部署最后分成三种工作,名称换成了通用说法:
| 环境 | 做什么 | 工作目录 | GitHub 流程 |
|---|---|---|---|
| 开发 | 网站功能、前端、修 bug | 网站 repo | feature 分支 → PR |
| 内容 | 文章、SEO、内容更新 | 同一个 repo 的独立 worktree | content 分支或 feature 分支 → PR |
| 后台服务 | 另一个独立项目的后端 | 独立的 repo | 更严格的审核和部署权限 |
内容环境不应该“顺手”去改数据库 schema、账号权限、环境变量或生产部署设置。只靠在 CLAUDE.md 里写规则不是技术上的访问控制,需要硬隔离时,用不同 Linux 用户、独立凭据和 GitHub 最小权限。共用 repo 的 CLAUDE.md 会影响所有 worktree;只想给内容环境的写作规范,可以放在独立文件里,开工时明确引用。
手机上看到三个名称,不等于三个服务都在运行。 我 2026 年 10 月 11 日的一份终端记录里,开发环境是 active (running),后台服务当时是 inactive (dead)。所以每次调整后,三个服务都要各自检查一次。
其中一个起不来(status=1/FAILURE)时怎么排查
我遇到过同一个 Linux 用户下,一个 Remote Control 正常连接,另一个启动后很快就结束,systemd 显示 code=exited, status=1/FAILURE。手上的日志不足以确认根因,也不能因此说“同一个用户不能运行两个 Remote Control”。排查顺序:
# 在管理员账号:1. 先停掉失败的那一个,避免反复重试干扰判断
PROJECT_USER=project-a
SERVICE=claude-project-a-content.service
uid=$(id -u "$PROJECT_USER")
sudo -u "$PROJECT_USER" \
XDG_RUNTIME_DIR="/run/user/$uid" \
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$uid/bus" \
systemctl --user stop "$SERVICE"
# 2. 读最近的日志,不要只看 status 的最后几行
sudo -u "$PROJECT_USER" \
XDG_RUNTIME_DIR="/run/user/$uid" \
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$uid/bus" \
journalctl --user -u "$SERVICE" -n 100 --no-pager
# 3. 用同一个用户、同一个工作目录手动运行,看实际错误
sudo -iu "$PROJECT_USER"
cd ~/projects/project-a-content
~/.local/bin/claude remote-control --name "VM1 - Project A - Content" --spawn=worktree
可以逐项用日志验证的检查:Claude 登录状态、CLI 版本、工作目录是否存在且是 git repo、用户的 HOME 和 PATH、是否还没回答 Enable Remote Control?、网络、内存,以及是否已经有同名的进程在运行。官方文档列出的错误信息里,没有登录或用的不是 claude.ai 订阅时会出现 You must be logged in to use Remote Control;环境变量设置了 ANTHROPIC_API_KEY 时会出现 Remote Control requires claude.ai subscription auth.。手动运行也失败的话,保留具体的错误文字,不要去猜是 OAuth、网络还是同时 session 的上限。
主机、Claude Code 安装和第一个常驻服务的完整步骤,见《Oracle Cloud 搭建 Claude Code Remote Control 常驻教程》;这些工具在整个网站中的角色,见《Jason Finance 从零到一》。
常见问题
一台主机可以运行多个 Claude Code Remote Control 吗?
可以。做法是每个环境一个 systemd user service,各自用 --name 设置在 Claude App 列表里显示的名称、各自指定工作目录。我 2026 年 10 月的部署就在同一台 Ubuntu ARM 主机上运行了多个 Remote Control 服务,但这不保证每个服务永远在线、不需要维护。
多个 Remote Control 要用不同 Linux 用户,还是同一个?
看信任边界。不同用户各有自己的 Claude 登录、SSH key、GitHub 授权和 systemd 服务,隔离更好,但每个都要重新认证。同一个用户更方便,但所有项目共用操作系统权限;处理生产环境、数据库这类高风险项目时,应该分开用户并给最小权限。
同一个 GitHub repo 怎么把开发和写文章分开?
不用另开 repo,用 git worktree 从同一个 repo 建第二个工作目录,放在它自己的分支上,例如 content/editorial,再为它建一个独立的 Remote Control 服务。创建前先确认分支不存在,已存在就不要用 -b。
--spawn=worktree 是什么?可以当作隔离吗?
--spawn=worktree 让 Remote Control 每个按需创建的 session 都有自己的 git worktree,需要在 git repo 里运行。它隔离的是工作目录,不是操作系统权限,也不保证 session 一定在你预期的分支上,开 PR 前要检查分支和 diff。
--capacity 默认是多少?
官方说明 --capacity 是同时 session 的上限,默认 32。我部署时的日志曾显示 Capacity: 1/32,那是当时的输出,不代表每个套餐或版本都一样。
在手机上改了 Remote Control 的名称,会影响 repo 或服务吗?
对话标题、环境显示名称、--name 参数和 systemd 服务名称是不同层次。改 App 里的显示名称一般不会改到 Git repo、分支或 unit 文件,但服务重启后名称怎么显示,要用当前的 Claude Code 版本实际确认。
延伸阅读
- 看不懂代码也能建网站:我用 Claude Code + GitHub + Cloudflare 低成本搭建 Jason Finance 的方法与成本我看不懂代码,Jason Finance 是用 Claude Code、GitHub、Cloudflare Workers 和 Supabase 免费方案搭起来的。整理整套架构、每个服务的用途与费用、我怎么给 AI 权限,以及这种做法的限制。
- Git 可以 push,Claude Code 却读不到 GitHub Issues:SSH 与 GitHub API 权限的区别Claude Code GitHub Issues 读不到,但 git push 正常?SSH key 只授权 Git 传输,Issues 和 PR 要另外的 API 认证。用 gh CLI 登录、确认权限、保护 token,并把 Issue 串成 PR 流程。
- 看不懂 SSH 也能维护 WordPress:Jason Career 用 Claude Code、SSH 与 WP-CLI 管理网站的实际记录Jason Career 是有 65 个插件、电商和课程的 WordPress 网站。我看不懂 SSH 和程序,改用 Claude Code 通过 SSH 与 WP-CLI 维护:10 天内做了哪些事、遇到哪些问题,以及我怎么限制 AI 在正式网站上的权限。

留言
使用 Google 登录即可留言。留言“不会”使用您的 Google 头像或姓名,对外显示的昵称是系统随机生成的代号,以保护您的隐私。
登录即表示你同意本站的隐私政策。