三種裡最安全的是哪個?
文件沒有排序。依各自放棄的東西,範圍最小的是 --no-sandbox(只放棄瀏覽器自己的隔離),最大的是 allowNestedUserNamespaces(文件用警告框,說代碼可能在沙盒外執行)。這個排序是我的判斷。
excludedCommands 我寫了 playwright,為什麼沒生效?
多半是樣式。文件說樣式要以 * 結尾、整條呼叫的每個命令都要匹配,而且比對的是呼叫文字:npm test 內部呼叫的 playwright 不算。要匹配你實際讓 Claude 執行的那條命令。
可以寫在專案的 settings.json 讓全隊共用嗎?
allowNestedUserNamespaces 不行:文件說要放使用者設定,專案無法開啟。excludedCommands 在沙盒被設為「admin-required」時,專案檔裡的條目會被忽略。
不是工程師,這跟我有什麼關係?
如果有人為了讓測試能跑而在設定裡打開其中一項,等於在安全上開了個洞。知道有哪三種、各自代價是什麼,才能在 code review 時問對問題。
在 Linux 或 WSL2 的 Claude Code 沙盒裡跑 Chromium、Playwright 或 rootless Podman,常會撞到 No usable sandbox!。官方沙盒文件對這個問題給了三種處理,每一種都放棄了不同的東西。本文把三者並排比較。以下事實引自官方沙盒文件與 changelog;我沒有在自己的機器上實測這三種做法,會提到的取捨都是文件的說法加上我的整理。
文件說明,在 Linux 與 WSL2 上,沙盒內的命令預設不能建立 user namespace,所以依賴它的工具會失敗。文件列出的症狀:Chromium 以 No usable sandbox! 結束;unshare -U true 印出 Operation not permitted;rootless Podman 印出 cannot clone: Operation not permitted,或更早因為自己的某個資料夾 read-only file system 而停止。
對 Chromium 或 Electron,啟動時加 --no-sandbox。Claude Code 的沙盒維持不變,代價是瀏覽器在沒有它自己沙盒的情況下執行網頁內容。如果測試只開你自己控制的本機頁面,這個代價比較小;如果會開外部網址,風險就在瀏覽器那一層。這是我的判斷,文件只說「放棄了瀏覽器自己的隔離」。
把命令樣式放進 sandbox.excludedCommands,符合的命令會在沙盒外以你的完整權限執行:
{
"sandbox": {
"enabled": true,
"excludedCommands": ["npx playwright test *"]
}
}
文件列了幾條會踩到的規則:
* 結尾;沒有萬用字元的樣式是完全比對,docker 只匹配不帶參數的 docker。npm ci && docker compose build 除非另一條涵蓋 npm ci,否則仍在沙盒內。make 目標在內部呼叫的工具不算,/usr/local/bin/docker 也不算。所以跑瀏覽器時,要匹配的是測試命令,不是瀏覽器。cd、$(...) 會讓整個呼叫留在沙盒內。文件另外警告:Claude 可以先編輯你工作目錄裡的腳本再執行它,而被排除的命令有你的完整權限,所以排除一個會跑腳本的命令,等於把那個腳本的內容也放出沙盒。被排除的命令仍走一般權限流程,auto mode 下由分類器審查;在 bypassPermissions 模式則不會提示,除非有 ask 規則匹配。
v2.1.305 新增:
{
"sandbox": {
"allowNestedUserNamespaces": true
}
}
文件要求把它設在 ~/.claude/settings.json,不是專案的 .claude/settings.json,並說專案無法開啟這個設定。好處是保留 Chromium/Electron 自己的沙盒,也能跑巢狀的 bubblewrap 或 unshare。代價,文件用了警告框:你關掉了一道安全邊界,沙盒化命令裡的程式碼最後可能在沙盒之外執行;不要倚賴沙盒的任何限制,包括受保護路徑與 credentials.files,去擋一個惡意命令;在 auto-allow 模式下,那個命令可以不經提示就執行。文件還說,開頭是 unshare 的命令無論 excludedCommands 怎麼寫都會留在沙盒內,而這個設定單獨並不足以讓 rootless Podman 或 Buildah 運作,因為沙盒還有別的方式擋住它們。
excludedCommands,並預期你接受這些命令有完整權限。CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1:文件說這時每條命令都在沙盒內執行,上面的設定都沒有作用,Chromium/Electron 用 --no-sandbox,其他工具請在 Claude Code 外自己跑。這個排序(先小範圍、再排除、最後才動 namespace)是我的建議,依據是文件各選項的描述,不是我對三者做的比較測試。