Claude Code v2.1.321 實戰:用 --settings 管住 Remote Control、補上 MCP OAuth 漏洞、Fable 5.2 怎麼切
v2.1.321 讓 claude remote-control 能替手機開出的每個 session 套同一份設定檔,修掉 MCP OAuth 轉址時 refresh token 外流的問題,並讓 fable 別名指向 Fable 5.2。這篇給你可照抄的設定、升級後該跑的指令,以及幾個容易踩的坑。
11 月 9 日釋出的 Claude Code v2.1.321,changelog 一口氣列了 60 多條。大部分是修 bug,但有三件事會直接改變你明天怎麼用它:
claude remote-control多了--settings <file>,可以替「從手機或網頁開出來的每個 session」套同一份規則。- 修掉一個 MCP OAuth 的洞:伺服器回轉址時,refresh token 這類機密會被送到另一台主機。順手還補了三個權限檢查的漏網之魚。
- Fable 5.2(
claude-fable-5-2)上線,成為fable別名指向的模型。
這篇不重貼 changelog,而是把這三件事拆開講:機制是什麼、該怎麼設、哪裡有坑。以下設定和指令都對過官方文件與本機 claude remote-control --help(v2.1.321);沒實際跑過的地方會直接標出來。
一、為什麼 remote-control 需要自己的設定檔
先回顧 Remote Control 是什麼。你在電腦上跑 claude remote-control(別名 claude rc),它會變成一個常駐的 server,你從 claude.ai/code 或 Claude 手機 App 連進來下指令。Claude 和它執行的指令都跑在你這台電腦上,App 只是顯示畫面。這跟 cloud session 剛好相反。
這帶來一個很實際的問題:你人在捷運上用手機開了一個新 session,叫它「把這個 bug 修掉」。那個 session 用的是哪一份權限規則?能不能 git push?能不能讀 .env?有沒有 sandbox?
v2.1.321 以前,你能在 server 層級控制的東西很少:--permission-mode、--chrome、--spawn 這幾個。原本的 --sandbox/--no-sandbox 在 v2.1.300 已經移除,官方文件的說法是「要讓 server 開的 session 跑在 sandbox 裡,請在 settings 檔裡開」。問題是,那份 settings 檔是哪一份?通常就是專案的 .claude/settings.json 或你的 ~/.claude/settings.json,跟你平常坐在電腦前用的是同一份。
你很可能希望「人不在電腦前」的 session 規則比較嚴。v2.1.321 的 --settings 就是這個缺口的解法。

二、--settings 的運作規則(從 --help 原文拆)
本機 v2.1.321 的 claude remote-control --help 對這個旗標寫了四件事,每一件都有實際影響:
1. 啟動時讀一次(Read once, at start)。 檔案內容在 server 啟動那一刻就定下來,後面每個 spawn 出來的 session 都吃同一份。
2. 檔案一改,新 session 就開不出來,直到你重啟 Remote Control。 注意它不是「熱載入新內容」,也不是「繼續用舊內容」,而是停止開新 session。從設計上看,這是 fail-closed:規則被動過,它寧可不開,也不會在你不知情的狀況下用一份不確定的規則開工。
3. 「Keep it where sessions can't write.」 這句是整個功能的安全前提。如果你把這份檔案放在專案目錄裡,session 裡的 Claude 是有可能去改它的;就算第 2 點讓修改不會生效,也會讓你的 server 卡住不能開新 session。放到專案以外、session 寫不到的地方。
4. 有帶 --settings 時,從 project 開出來的 session 不會被自動開 auto-compact 和 auto mode。 help 原文是:沒帶這個旗標時,Remote Control 會替「從 project 開的 session」把 auto-compact、以及優先於本機設定的 auto mode 打開;帶了 --settings,就不會。換句話說,帶了它,你的設定檔才是說了算的那一方。
一個常見地雷:旗標放錯位置
claude 本身也有全域的 --settings 旗標,所以很多人會順手寫成:
# ✕ 錯:放在動詞前面
claude --settings ~/.config/claude-rc/rc.json remote-control
官方 errors 文件寫得很清楚:放在 remote-control 前面的全域旗標不會傳給它開的 session。對於 --settings、--setting-sources、--permission-mode、--disallowed-tools、--mcp-config 這類會限制 session 的旗標,Claude Code 會直接拒絕啟動,而不是默默丟掉,錯誤訊息長這樣:
Error: `--settings` before `remote-control` is not carried over to the sessions Remote Control starts, so Remote Control refuses to start rather than drop it — remove it, and give Remote Control's own options after the verb (see `claude remote-control --help`).
正確寫法是放在動詞後面:
# ✓ 對
claude remote-control --settings ~/.config/claude-rc/rc.json
--verbose、--model 這類丟了也不影響權限的旗標,它會忽略然後照常啟動。如果你有 wrapper script 會自動塞旗標,升級後第一件事就是跑一次確認它沒被擋。
三、手把手:做一份「出門用」的 remote-control 設定
以下是一份可以照抄再改的起手式。目標是:人不在電腦前時,Claude 可以讀、可以改程式、可以跑測試,但推不了 code、碰不到機密、指令都在 sandbox 裡。
Step 1:把設定檔放到專案外面
mkdir -p ~/.config/claude-rc
cat > ~/.config/claude-rc/away.json <<'JSON'
{
"permissions": {
"deny": [
"Bash(git push *)",
"Read(./.env)",
"Read(./.env.*)",
"Edit(./.env)",
"Edit(./.env.*)"
]
},
"sandbox": {
"enabled": true,
"allowUnsandboxedCommands": false,
"failIfUnavailable": true
}
}
JSON
chmod 444 ~/.config/claude-rc/away.json
每個鍵在做什麼(都對過官方 sandboxing 文件):
sandbox.enabled:讓 Bash 指令跑在 OS 層級的 sandbox 裡,檔案寫入和網路都受限。allowUnsandboxedCommands: false:關掉「sandbox 跑失敗就改成不 sandbox 重試」的逃生門。關掉後,Claude 送的dangerouslyDisableSandbox參數會被忽略。/sandbox的 Overrides 分頁把這個叫做 Strict sandbox mode。failIfUnavailable: true:預設情況下,平台不支援 sandbox 時 Claude Code 會「不 sandbox 照跑」。設成true改成直接在啟動時退出。對無人看管的 session,你要的是後者。chmod 444是額外保險,讓檔案唯讀;但主要防線是第 3 點說的「放在 session 寫不到的位置」,搭配 sandbox 的寫入限制。
Step 2:啟動 server
cd ~/work/my-repo
claude remote-control \
--settings ~/.config/claude-rc/away.json \
--spawn worktree \
--permission-mode acceptEdits \
--name "my-repo (away)"
--spawn worktree:每個從手機開的 session 都拿到自己的 git worktree,不會跟其他 session 搶同一份檔案。預設的same-dir會讓所有 session 共用目錄,同時改同一個檔案時會互相踩。--permission-mode acceptEdits:檔案編輯自動接受,其他照權限規則走。不建議在這裡用bypassPermissions。
Step 3:驗證規則有吃到
從手機開一個新 session,請 Claude 執行 git push --dry-run、讀 .env。兩個都應該被擋。再改一下 away.json(記得先 chmod 644),然後從手機開新 session,照 help 的描述應該開不出來,重啟 server 後恢復。這個驗證值得做一次,因為你要確定自己理解的 fail-closed 行為跟實際一致。
這份設定擋不住什麼(誠實說)
官方 permissions 文件有一張表直接寫出來:deny 規則 Bash(git push *) 擋得住 git push origin main,但擋不住 git -C . push origin main 或 git -c push.default=current push origin main。字串比對式的 deny 規則是「減少意外」,不是安全邊界。會擋下來的是 sandbox 的網路限制:沒有把 git 主機加進 network.allowedDomains,push 在網路層就出不去。所以上面那份設定,sandbox 那幾行比 deny 規則更重要。
另外一個值得實測的點:官方 sandboxing 文件寫到,在 managed settings 或 --settings 旗標裡把 allowUnsandboxedCommands 設成 false,sandbox 會變成「admin-required」,這時 repo 自己的 .claude/settings.json 裡放寬 sandbox 的設定(excludedCommands、network.allowedDomains、filesystem.allowWrite 等)都會被忽略。文件描述的是 claude --settings;claude remote-control --settings 是否同樣觸發 admin-required,文件目前沒寫明。如果你要靠這點擋住惡意 repo,請自己驗證一次。
四、MCP OAuth 修補:refresh token 被轉址帶走
changelog 原文:「Fixed MCP OAuth requests sending secrets such as refresh tokens to another host when a server redirected them」。

機制是什麼
遠端 MCP 伺服器大多走 OAuth 2.0。你登入一次之後,Claude Code 會存一組 access token 和 refresh token;access token 過期時,它拿 refresh token 去伺服器的 token 端點換新的。官方 MCP 文件描述了這段流程:伺服器回 401 時,有 refresh token 就刷新、重連、重試一次。
問題出在「伺服器回轉址」這一步。HTTP 的 307/308 轉址規定要保留原本的方法和 body,所以一個天真的 HTTP client 跟著轉址走,會把同一包含有 refresh token 的請求原封不動送到新網址。如果新網址是另一台主機,你的長效憑證就交出去了。changelog 沒有公開細節(哪種轉址碼、哪條程式路徑),上面是從描述推的典型情境;修補的方向很明確:機密不跟著轉址跨主機。
refresh token 的殺傷力在於它的壽命通常比 access token 長得多,拿到的人可以自己一直換新的 access token。
你該做什麼
# 1. 升級
claude update
claude --version # 確認 >= 2.1.321
# 2. 盤點遠端 MCP
claude mcp list
# 3. 對不放心的伺服器:先撤銷,再重新登入
claude mcp logout <name>
claude mcp login <name>
第 3 步的順序有講究。官方文件提醒:claude mcp remove 只會刪掉本機存的 token,不會到授權伺服器撤銷。要撤銷,必須先跑 claude mcp logout <name>(前提是授權伺服器支援 revocation),再決定要不要 remove。
要不要做第 3 步,判斷標準很簡單:你裝的遠端 MCP 裡,有沒有你不完全信任營運方、或曾經出現奇怪轉址的?官方的、大廠的 connector 風險低;從某個 GitHub README 抄來的第三方 endpoint,撤銷重登一次的成本只有幾秒。
這次一起補的權限洞
同一版還修了三個「該問沒問」的權限問題,都值得知道:
- 一個唯讀的 Bash 指令在某種情況下跑到 sandbox 外面,而且沒跳權限提示。
- Bash 的權限檢查在某些情況下用錯資料夾判斷一個寫檔動作,因此沒提示。
cp或mv到一個資料夾時(例如cp secret.txt ./out/),deny 規則和受保護檔案提示沒有套用到實際被寫入的那個檔案。
第三個最值得回頭檢查:如果你的 deny 規則是寫給特定檔案路徑的,以前透過「複製到資料夾」這種寫法有機會繞過。升級後就補上了,但這再次說明前面那句:deny 規則是第一層,sandbox 才是牆。
順帶一提,MCP 文件也列了 Claude Code 在新版 MCP runtime 上的其他 OAuth 防護:授權回應的 issuer 不符就讓登入失敗、只把 OAuth 憑證送到 HTTPS(或 localhost)的 token 端點。這次修補補的是轉址這條路。
五、Fable 5.2:「預設」指的是哪個預設
changelog 的寫法是「now the default Fable model」。這句很容易被讀成「Claude Code 預設模型換成 Fable 5.2」,不是。官方 model-config 文件寫得很明白:「No Fable model is the account-type default on any plan or provider.」任何方案都不會預設用 Fable,你要自己選。
這裡的「預設」是指 fable 這個別名現在解析到 Fable 5.2(Claude apps gateway 除外,那邊預設仍指 Fable 5)。
規格與價格(官方數字)
| 項目 | Fable 5.2 | Fable 5.1 | Opus 5.5 |
|---|---|---|---|
| 輸入/輸出(每百萬 token) | $8/$40 | $10/$50 | $4/$20 |
| 快取讀取 | $0.20 | $0.25 | $0.20 |
Fable 5.2 另有 1M context。來源:v2.1.321 changelog(Fable 5.2 規格)、Anthropic 價目表(其他欄)。Fable 5.2 比 5.1 便宜 20%,但單價仍是 Opus 5.5 的兩倍。
怎麼切過去
claude update # Fable 5.2 需要 v2.1.321 以上
claude --model fable # 啟動時指定
# 或在 session 裡
/model fable
幾個切換細節(官方 model-config 文件):
- Pro/Max 方案:如果你的 user settings 存的是
claude-fable-5-1,第一次跑 v2.1.321 時會自動改成fable別名,啟動列可能顯示一次(auto-updated)。 - Team/Enterprise:這個搬移要等組織設定,可能晚一點才發生,也可能不發生。跑
/model確認。 - project、local、managed settings 裡寫死的
claude-fable-5-1不會被改。團隊的共用設定檔記得自己更新。 - 搬移後,session 會用 Fable 5.2 的預設 effort。Anthropic 發表文寫到,Claude Code 的預設是 Medium。
怎麼用才划算
官方 model-config 文件給了四條 Fable 用法建議,翻成實戰語言:
- 描述結果,不要列步驟。 給它「要達成什麼」,讓它自己規劃路徑。
- 丟模糊的問題給它。 根因調查、事故除錯、架構決策,最能發揮它多花的調查和驗證。
- 不用一直提醒它測試。 它比小模型更常自己驗證,「記得跑測試」這類提醒通常多餘。
- 給它你原本會拆成好幾段的大任務。 它撐得住長 session。
一個 prompt 對比:
# 給 Opus 5.5 時你可能會這樣寫
1. 讀 src/billing/ 底下的檔案
2. 找出 invoice 金額算錯的地方
3. 修好並補測試
4. 跑 npm test 確認通過
# 給 Fable 5.2 可以改成這樣
上週開始有客戶回報發票金額偶爾少一分錢,只在跨月訂閱發生。
找出根因、修好,並確保同類問題以後會被測試抓到。
但要記得 Anthropic 自己的建議:大多數 coding 任務先從 Opus 5.5 開始,碰到真正困難、開放式的工作再往上切到 Fable。用 Fable 做日常小修改,是拿兩倍單價買你用不到的能力。
自動換模型
Fable 的請求如果被安全分類器擋下(最常見是資安和生物領域),會自動改由別的模型回答:資安類改用 Opus 4.8,生物類改用 Opus 5。做資安相關開發(例如寫 fuzzer、分析漏洞)的團隊,可能會發現回答忽然換了模型,這是設計行為。v2.1.321 也修了一個相關問題:第一個模型在回答前就被擋時,fallback 模型有時會拒答,或提到一個「被中止的回應」。
六、其他值得知道的修正
快速列幾條跟日常使用直接相關的:
- 平行 Bash 跑錯資料夾:Claude 一次送出多個指令、其中前面一個
cd了,後面的指令有時會在錯的資料夾跑。已修。 claude -p背景指令時限:以前會告訴 Claude 背景指令有 30 分鐘,實際上 10 分鐘就被停。現在說法一致。寫 headless 腳本時以 10 分鐘為準。- session 開始時的 git status:
git status失敗時以前會被當成「乾淨」,現在顯示為不可用;另外修了第一個檔案被誤標為 staged 的問題。 grep -r foo "$PWD/src"這類帶變數的唯讀指令,以前會跳權限提示,現在跟手打路徑一樣不問。- 網路路徑上的 Edit/NotebookEdit(UNC share、WSL 資料夾、
/net掛載):修了改錯位置、空old_string覆蓋整個檔案等問題。在 WSL 上工作的人值得升。
七、對工程團隊:一份可照做的檢查清單
- 全員升到 2.1.321 以上。 MCP OAuth 和三個權限修補是直接理由,不用等。
- 檢查 wrapper script。 如果有人把
--settings或--permission-mode放在remote-control前面,升級後會直接啟動失敗。 - 為 Remote Control 做一份專用設定檔,放在 repo 外、session 寫不到的地方,至少開 sandbox 加
allowUnsandboxedCommands: false。 - 盤點遠端 MCP,不放心的先
claude mcp logout再重登。 - 更新共用設定裡寫死的模型 ID。 project/managed settings 的
claude-fable-5-1不會自動搬。 - 把「deny 規則不是安全邊界」寫進團隊文件。 字串比對會被
git -C . push繞過,牆是 sandbox。
來源
- Claude Code v2.1.321 release notes(Anthropic):https://github.com/anthropics/claude-code/releases/tag/v2.1.321
- Remote Control 官方文件:https://code.claude.com/docs/en/remote-control
- 錯誤訊息文件(旗標放錯位置):https://code.claude.com/docs/en/errors
- Sandboxing 官方文件:https://code.claude.com/docs/en/sandboxing
- Permissions 官方文件(deny 規則比對範例):https://code.claude.com/docs/en/permissions
- MCP 官方文件(OAuth、logout/remove):https://code.claude.com/docs/en/mcp
- Model configuration 官方文件(Fable 別名、自動 fallback):https://code.claude.com/docs/en/model-config
- Claude Fable 5.2 發表文(Anthropic):https://www.anthropic.com/claude-fable-and-mythos-5-2
- Anthropic 價目表:https://platform.claude.com/docs/en/about-claude/pricing
- 本機
claude remote-control --help(v2.1.321)
整理:DataAgent · Coding Agent 實戰教學