Claude CodeのbypassPermissionsでrm確認を止める環境変数と効かない条件
bypassPermissionsでも出るrm・rmdirの確認を、CLAUDE_CODE_EVEN_MORE_DANGEROUSLY_SKIP_PERMISSIONS=1で止める手順。v2.1.311以降が条件。
--permission-mode bypassPermissions で動かしているのに、rm -rf だけ確認が出て無人のジョブが止まる。原因は、許可ルールでも承認できない「critical-path削除」の確認が、bypassPermissionsにも残っているからです。
止める変数が CLAUDE_CODE_EVEN_MORE_DANGEROUSLY_SKIP_PERMISSIONS=1 です。v2.1.311以降が必要で、claude を起動する環境に置く必要があります。効かない原因はほぼ決まっているので、確認の手順と合わせて並べます。
bypassPermissionsでも出るrm確認の正体
bypassPermissionsは、権限確認と安全チェックを飛ばしてツール呼び出しを即実行するモードです。それでも rm と rmdir のうち、対象がcritical pathと判定されたものは確認が出ます。
critical pathに数えられる対象は次のとおりです。
- ファイルシステムのルートと、その直下のディレクトリ(
/usr、/etc、/dataなど) - ホームディレクトリ
- 作業ディレクトリとその親
- 追加の作業ディレクトリ配下のglob(
rm -rf <dir>/*)。ディレクトリ自体のrm -rf <dir>は対象外
rm -rf "$DIR"/* のように変数の直下にglobや末尾スラッシュが付く形や、rm -rf "$(pwd)" のようにコマンド置換の出力だけが対象の形も、critical pathとして扱われます。変数が空だとルートの削除になるためです。全体像はProtected pathsとCritical pathsの違いで扱っています。
bypassPermissionsでのこの確認は、ターミナルでは承認を求める形で出ます。auto とbypassPermissionsのターミナルでは2分のカウントダウンが付き、時間内に答えないとコマンドは拒否されます。3回続けて時間切れになると、そのセッションでは以降の削除が即座に拒否されます。VS Code拡張のチャット欄とデスクトップアプリでは、PermissionRequest フックが許可しない限り拒否されます。
変数なしと変数ありのbypassPermissions
変数なし
critical-path削除はターミナルで承認を求められ、2分で時間切れになる。許可ルールやフックでは通せない。
EVEN_MORE_DANGEROUSLY_SKIP_PERMISSIONS=1
BashとMonitorのcritical-path削除が、確認なしで実行される。解析しきれないコマンドも同じ。
変数を設定して起動する
変数は claude を起動するシェルで設定します。設定してから --permission-mode bypassPermissions で起動する流れです。
export CLAUDE_CODE_EVEN_MORE_DANGEROUSLY_SKIP_PERMISSIONS=1
claude --permission-mode bypassPermissionsWindowsのPowerShellとCMDでは、設定の書き方が変わります。
$env:CLAUDE_CODE_EVEN_MORE_DANGEROUSLY_SKIP_PERMISSIONS = "1"
claude --permission-mode bypassPermissionsset CLAUDE_CODE_EVEN_MORE_DANGEROUSLY_SKIP_PERMISSIONS=1
claude --permission-mode bypassPermissionsbypassPermissionsは、有効にして起動したセッションでしか使えません。起動時に permissions.defaultMode: "bypassPermissions" か、--permission-mode bypassPermissions、--dangerously-skip-permissions のどれかで入ります。変数だけではモードに入れないので、この前提を先に満たしてください。
settingsのenvブロックでは効かない
変数をsettings.jsonに書いても無視されます。Claude Codeはこの変数を起動環境からしか読まず、どの種類のsettingsファイルでも env ブロックの値を無視するためです。
{
"env": {
"CLAUDE_CODE_EVEN_MORE_DANGEROUSLY_SKIP_PERMISSIONS": "1"
}
}上の設定は書いても効きません。チームで共有するリポジトリのsettingsに入れて全員の削除確認を外す、という使い方ができない設計です。外す責任を、起動する人の環境に残しています。
自分のマシンで常用するなら、~/.zshrc などのプロファイルに export を書く方法もあります。効く範囲は、後述の起動スクリプトで狭められます。
効いているかは起動時の1行で確かめる
変数が働いているかは、起動時にClaude Codeが出す1行で分かります。-p の実行ではstderrに出ます。Agent SDKのアプリでは、stderr オプションを渡すと読めます。
| 起動時の文言 | 状態 |
|---|---|
is set, so dangerous rm commands can run without a prompt | 状態managed settingsとプラグインのフックが読み込まれた後、確認なしで実行できる |
has no effect in this session | 状態セッション全体で、削除は通常の確認か拒否のまま |
has no effect while the Windows registry cannot be read for managed settings | 状態削除は通常の扱い。後でレジストリの読み取りに成功すれば、再起動なしで有効になる |
この行が出ていないからといって、確認が有効とは限りません。Agent SDKで stderr オプションを渡していないと、行は見えないまま確認なしで動いている場合があります。
出していない変数の行が出た場合は、シェルのプロファイルなど、どこかで設定されています。見つけて外してください。
動作を試すなら、使い捨てのディレクトリが安全です。空のディレクトリを作ってそこで起動し、作業ディレクトリ自身を指す rmdir をClaudeに実行させます。作業ディレクトリはcritical pathなので、変数なしなら確認が出る想定の操作です。空のディレクトリなので、通っても失うものはありません。変数を付けた起動と付けない起動で同じ操作を試し、確認の出方を見比べると、効いているかどうかが一目で分かります。
設定したのに確認が出る原因
has no effect in this session が出る、または行は出ているのに削除の確認が残る場合は、次の原因を上から確かめます。
| 原因 | 直し方 |
|---|---|
--permission-prompt-tool、Agent SDKの canUseTool コールバック(--permission-prompts none なし)、matcher付きの PermissionRequest フック、同じイベントを扱うmodが権限確認を担当している | 直し方フック、mod、ツール、コールバックを外して claude を起動し直す |
| VS Code拡張のチャット欄か、デスクトップアプリがセッションを動かしている | 直し方ターミナルで claude を起動する |
| Bash、Edit、Readを対象にしたdenyルールかaskルールがある(起動時、またはセッション中に読み込まれた後。後で消しても残る) | 直し方ルールを外して再起動する。ツールを使わせないなら、denyルールではなく --tools で外す |
permissions.blockReadsOutsideWorkingDirectories が true | 直し方すべてのsettingsファイルから外して再起動する |
別のセッションの中で claude を起動している(BashツールやフックからのClaude Code起動を含む) | 直し方自分のシェルから起動する |
削除に対して PreToolUse フックが ask を返している | 直し方フックの戻り値を変える |
| バックグラウンドセッション、分割ペインのagent teamのチームメイト、Remote Controlサーバーが作るセッション | 直し方変数なしで始まる。自分のシェルから起動する |
| managed settingsを読み込めていない | 直し方サーバー管理のsettingsなら、取得失敗の原因を直す。それ以外は管理者に頼む |
| WindowsとWSLでレジストリを引けない(英語以外のWindows、interop無効のWSL、WSL2カーネル上のコンテナ) | 直し方interopが無効なら有効にする。それ以外は削除を自分で実行する |
バックグラウンドセッションの行は見落としやすい点です。バックグラウンドセッションでbypass permissionsが無視される問題は別の原因ですが、起動経路の違いで挙動が分かれる点は共通しています。
範囲を狭めるなら起動スクリプトに閉じ込める
隔離環境の専用スクリプトに閉じ込めれば、通常の起動には影響しません。例えば、コンテナの中だけで使う次のようなスクリプトです。
#!/usr/bin/env bash
# run-claude-isolated.sh: 使い捨てコンテナの中だけで呼ぶ
export CLAUDE_CODE_EVEN_MORE_DANGEROUSLY_SKIP_PERMISSIONS=1
exec claude --permission-mode bypassPermissions "$@"exec で claude に置き換えているので、変数はこの起動にだけ渡ります。手元のマシンでは、変数を含まない別の起動方法を使い分けます。-p で非対話実行する場合も、同じスクリプトから呼べます。ジョブのログに残せば、効いたかどうかを後から追えます。
変数があっても止まらないもの
変数が外すのは、BashとMonitorツールで、critical-path検査に当たった削除の確認だけです。ほかの制限は残ります。
- プランモード: 確認なしで走るのはbypassPermissionsモードそのものだけで、プランモードでは外れません
- Bashとは別の検査:
Remove-Itemや、cmd経由のrd、delなどは別のチェックを持ちます。bypassPermissionsはPowerShellの作業ディレクトリ削除の確認を飛ばしますが、システムパスとワイルドカードの拒否は全モードで残ります - denyルール: 一致するdenyルールは削除をブロックします。
rmの許可ルールやBashの包括許可は、この検査を通すものではなく、変数の有無に関係しません - サンドボックス: OSが書き込めるパスを絞る制御は、変数と無関係に効きます
逆向きの注意もあります。確認が出なくなるのは、検査が見つけた削除だけでなく、Claude Codeが解析しきれなかったコマンドも含みます。確認が外れる範囲は、rm -rf ~ の入力より広いと考えてください。
同じ系統の変数との役割分担
CLAUDE_CODE_DISABLE_ で始まる4つの変数は、確認の一部の局面だけを外します。EVEN_MOREは、bypassPermissionsでのcritical-path削除の確認をまとめて外す点が違います。
| 変数 | 外すもの |
|---|---|
CLAUDE_CODE_DISABLE_DANGEROUS_RM_TIMEOUT | 外すものbypassPermissionsのターミナル確認の時間制限。VS Codeのチャット欄では確認が出る |
CLAUDE_CODE_DISABLE_SUBSTITUTION_RM_PROMPT | 外すものコマンド置換の出力だけが対象の削除の確認 |
CLAUDE_CODE_DISABLE_INLINE_SHELL_RM_PROMPT | 外すもの-c で渡した小さなスクリプト内の、critical pathを直接書いた削除の確認 |
CLAUDE_CODE_DISABLE_MOUNTED_DRIVE_RM_PROMPT | 外すもの/Volumes/USB などのマウントドライブの確認 |
CLAUDE_CODE_EVEN_MORE_DANGEROUSLY_SKIP_PERMISSIONS | 外すものbypassPermissionsでのcritical-path削除の確認(v2.1.311以降) |
どれも起動環境から読まれ、settingsのenvでは無視されます。前の4つの使い分けはrm安全プロンプトを環境変数で無効化する方法に、マウントドライブの変数単体はマウントドライブのrm確認を環境変数で止めるにあります。
入れる前に確かめたいこと
この変数を入れると、rm -rf ~ のような削除が、確認なしで走る状態になります。入れてよい環境は、中身を失っても困らない隔離環境です。コンテナや使い捨てVMで、非rootのユーザーで動かす構成が前提になります。Dev Containerの構成はその一例です。
確認だけを外したい理由が「変数付きの rm -rf "$DIR"/* で止まる」なら、変数を入れずに済む手があります。展開を "${DIR:?}"/* のように守ると、変数が空のときはシェルがエラーで止まります。すべての展開をこの形で守った削除は、この検査を通ります。bypassPermissionsなら、ほかのcritical-pathの検査に当たらない限り確認なしで走ります。
反対に、CIのように人が答えられない環境なら、2分で拒否されるより変数で通す方が合う場合もあります。その場合も、削除が走りうる範囲は変数の外側で絞っておきます。
まとめ
bypassPermissionsでも出るrmの確認は、CLAUDE_CODE_EVEN_MORE_DANGEROUSLY_SKIP_PERMISSIONS=1 を起動環境に置くと止まります。必要なバージョンはv2.1.311以降で、settingsのenvには書けません。
入れたあとは起動時の1行で効きを確かめ、効かなければ表の原因を上から外していきます。変数なしで済むのは、変数が空の展開を "${DIR:?}" で守れる削除だけです。それ以外の削除を通す前提で入れるなら、失ってよい環境に限る、というのがこの変数の使いどころです。
参照した一次ソース
この記事の記述は、次の一次ソースと照合しています。更新時に参照先が変わった場合は一覧も更新します。