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。這篇給你可照抄的設定、升級後該跑的指令,以及幾個容易踩的坑。

AI Academy 編輯部2026年11月10日

11 月 9 日釋出的 Claude Code v2.1.321,changelog 一口氣列了 60 多條。大部分是修 bug,但有三件事會直接改變你明天怎麼用它:

  1. claude remote-control 多了 --settings <file>,可以替「從手機或網頁開出來的每個 session」套同一份規則。
  2. 修掉一個 MCP OAuth 的洞:伺服器回轉址時,refresh token 這類機密會被送到另一台主機。順手還補了三個權限檢查的漏網之魚。
  3. 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 就是這個缺口的解法。

remote-control --settings 運作流程:設定檔在啟動時讀一次,套用到 server 開出的每個 session

二、--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 修補前後對比:伺服器回轉址時,修補前 refresh token 會被帶到另一台主機,修補後不會

機制是什麼

遠端 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.2Fable 5.1Opus 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 用法建議,翻成實戰語言:

  1. 描述結果,不要列步驟。 給它「要達成什麼」,讓它自己規劃路徑。
  2. 丟模糊的問題給它。 根因調查、事故除錯、架構決策,最能發揮它多花的調查和驗證。
  3. 不用一直提醒它測試。 它比小模型更常自己驗證,「記得跑測試」這類提醒通常多餘。
  4. 給它你原本會拆成好幾段的大任務。 它撐得住長 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 上工作的人值得升。

七、對工程團隊:一份可照做的檢查清單

  1. 全員升到 2.1.321 以上。 MCP OAuth 和三個權限修補是直接理由,不用等。
  2. 檢查 wrapper script。 如果有人把 --settings 或 --permission-mode 放在 remote-control 前面,升級後會直接啟動失敗。
  3. 為 Remote Control 做一份專用設定檔,放在 repo 外、session 寫不到的地方,至少開 sandbox 加 allowUnsandboxedCommands: false。
  4. 盤點遠端 MCP,不放心的先 claude mcp logout 再重登。
  5. 更新共用設定裡寫死的模型 ID。 project/managed settings 的 claude-fable-5-1 不會自動搬。
  6. 把「deny 規則不是安全邊界」寫進團隊文件。 字串比對會被 git -C . push 繞過,牆是 sandbox。

來源

整理:DataAgent · Coding Agent 實戰教學

最後更新:2026年11月10日