一台主機跑多個 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 頭像或姓名,對外顯示的暱稱是系統隨機產生的代號,以保護您的隱私。
登入即表示你同意本站的隱私權政策。