Claude Codeのマウントドライブのrm確認を環境変数で止める
/Volumesや /mnt/cへのrm -rfのmounted drive path確認をCLAUDE_CODE_DISABLE_MOUNTED_DRIVE_RM_PROMPTで止める手順と、残るプロンプトの見分け方です。
rm -rf build を許可ルールに入れているのに、USBメモリや外付けSSDの上だけ毎回確認が出る。原因は、Claude Codeが外部ドライブ上の再帰削除を別枠で見ているためです。確認の理由欄には Dangerous rm operation on mounted drive path: <path> と出ます。
止めるには、環境変数 CLAUDE_CODE_DISABLE_MOUNTED_DRIVE_RM_PROMPT=1 を設定して claude を起動し直します。ただしsettingsの env ブロックに書いても効きません。止めた後も別の理由で出るプロンプトが残るので、その見分け方も扱います。
マウントドライブの確認が出る条件
このプロンプトが出るのはmacOS、Linux、WSLです。再帰的な rm の対象が、マウントドライブとして扱われるパスの形に当てはまったときに出ます。/* で終わる対象は、再帰フラグがなくても同じ扱いです。rm /Volumes/USB/build/* は /Volumes/USB/build の削除と読まれます。
対象になるパスの形は、次の表のとおりです。<drive> や <name> はパスの1区間を表します。
| 配下 | 確認が出る形 | 例 |
|---|---|---|
/Volumes | 確認が出る形/Volumes/<drive>、/Volumes/<drive>/<name> | 例/Volumes/USB/build |
/System/Volumes | 確認が出る形/System/Volumes、/System/Volumes/<volume>、その下の1区間 | 例/System/Volumes/Data |
/media | 確認が出る形/media/<user>、/media/<user>/<drive>、その下の1区間 | 例/media/alex |
/run/media | 確認が出る形/run/media 以下の同様の形 | 例/run/media/alex/USB/build |
/mnt | 確認が出る形/mnt/<name>、1文字マウント(WSLの /mnt/c)の下の1区間 | 例/mnt/data、/mnt/c/Users |
相対パスは作業ディレクトリから数えます。/Volumes/USB で作業しているときの rm -rf build は /Volumes/USB/build が対象になり、確認が出ます。
/Volumes、/media、/mnt そのものへの rm は別の扱いです。こちらは理由欄が Dangerous rm operation on critical path: <path> になり、通常のcritical pathとして扱われます。理由欄の文言が、どちらの確認なのかを見分ける最初の手がかりです。
/Volumes/USB は1区間、/Volumes/USB/build は2区間です。表の形はドライブの下1区間までで、それより深いパスは表に載っていません。WSLで /mnt/c/Users を消そうとすると確認が出ますが、これは /mnt/<letter>/<name> の形に当たるためです。
モードごとに確認の扱いはどう変わるか
許可ルールがあっても確認が出るのは、このプロンプトがcritical-path削除と同じ経路で処理されるためです。許可ルールでは承認されず、結果は権限モードで決まります。critical pathの全体像はProtected pathsとCritical pathsの違いで扱っています。
| モード | 結果 |
|---|---|
default、acceptEdits | 結果承認を求められる |
plan | 結果承認を求められる。計画中に分類器(classifier)が使われ、bypass permissionsが使えないときは auto と同じ扱い |
auto | 結果ターミナルでは承認を求められ、時間制限がある。それ以外では拒否される |
dontAsk | 結果拒否される |
bypassPermissions | 結果承認を求められ、ターミナルでは時間制限がある |
auto と bypassPermissions のターミナルでは、確認に2分のカウントダウンが付きます。時間内に答えないとコマンドは拒否され、無人のセッションも止まりません。3回続けて時間切れになると、そのセッションでは以降の確認が即座に拒否されます。-p の非対話実行、Agent SDK、VS Code拡張のチャット欄、デスクトップアプリでは、auto モードの確認は表示されず即座に拒否されます。
rm に明示的なaskルールが一致している場合は、auto でも時間制限なしで確認が出ます。承認を求めるモードでは、PermissionRequest フックでプロンプトに答える手もあります。
つまり、CIやバッチで外付けドライブ上のビルド成果物を消したい運用では、確認が出るのではなく削除が拒否されて失敗します。変数が外すのはマウントドライブ向けのプロンプトだけです。権限モードの表にある auto の即時拒否や dontAsk の拒否は、critical-path削除と同じ経路の結果として並んでいます。permission-modesのページが「外した後」の例として載せているのはManualモードだけで、auto や dontAsk で変数を設定した後の結果は、そのページに記載がありません。無人の運用で変数を入れる場合は、先に対話セッションで1回動かして挙動を見る手があります。
環境変数で止める手順
設定する変数は CLAUDE_CODE_DISABLE_MOUNTED_DRIVE_RM_PROMPT で、値は 1 です。Claude Code v2.1.304以降が必要です。それ以前のバージョンでは、この変数は読まれません。
export CLAUDE_CODE_DISABLE_MOUNTED_DRIVE_RM_PROMPT=1
claude毎回の入力が面倒なら、~/.zshrc や ~/.bashrc に export 行を足します。WSLなら、WSL側のシェルの設定ファイルです。
設定が効いたセッションでは、/Volumes/USB のようなドライブ全体と、表にある他のパスで、このプロンプトが出なくなります。Bash(rm *) を許可し、Manualモードで /Volumes/USB を作業ディレクトリにしている場合、rm -rf build は確認なしで走ります。
設定したのに止まらないときの切り分け
設定後も Dangerous rm operation on mounted drive path が出るなら、変数がセッションに届いていません。原因は次の2つです。
確認が消えないときの切り分け
- Q変数を settings.json の env ブロックに書いたか?答えがいいえのとき答えがはい
この変数はどの種類のsettingsファイルの
envブロックでも無視されます。シェルのexport、起動スクリプト、DockerfileのENV、CIのjob設定など、claudeを起動する環境側に移します。 - Q変数を設定する前に起動したセッションを使い続けていないか?答えがいいえのとき答えがはい
実行中のセッションは後から変数を拾いません。
claudeを終了し、変数が設定された環境から起動し直します。
それでも出るなら
理由欄の文言を読み直します。次の節の3つは、別の原因のプロンプトです。
settingsの env で無視される変数の一覧には、この変数が名前つきで載っています。同じ制約は、同じ系統の CLAUDE_CODE_DISABLE_DANGEROUS_RM_TIMEOUT、CLAUDE_CODE_DISABLE_SUBSTITUTION_RM_PROMPT、CLAUDE_CODE_DISABLE_INLINE_SHELL_RM_PROMPT にもあります。この3つの使い分けはrm安全プロンプトを環境変数で無効化する方法にまとめています。
止めても残る別原因のプロンプト
Manualモードで rm の許可ルールがある場合でも、マウントドライブ上の rm が次の3つの理由で確認されることがあります。このときの理由欄には Dangerous rm operation on mounted drive path が出ません。
| 対象 | 例 | 確認が出る理由 | 止め方 |
|---|---|---|---|
| 作業ディレクトリの外 | 例/Volumes/USB/project で作業中に rm -rf /Volumes/USB/other | 確認が出る理由対象が作業ディレクトリの外にある | 止め方対象を含むディレクトリをセッションに追加する |
* を含む対象 | 例rm -rf build/* | 確認が出る理由* つきの対象は確認される | 止め方承認する、または * なしで対象を1つずつ指定させる |
| critical pathそのもの | 例/mnt 自体、作業ディレクトリ自体 | 確認が出る理由critical pathのまま残る | 止め方承認する |
1つ目は、ディレクトリの追加で解消します。起動時なら claude --add-dir /Volumes/USB、セッション中なら /add-dir です。設定ファイルの additionalDirectories にも書けます。追加したディレクトリの中のファイルは、元の作業ディレクトリと同じ許可ルールに従います。
2つ目は、コマンドの書き方で避けられます。Claudeに「* を使わず、削除するパスを1つずつ書いて」と頼めば、確認の対象から外れます。* つきの対象は、承認するか、* なしの指定に書き換えるかのどちらかになります。
3つ目は、変数では止まりません。作業ディレクトリそのものや /mnt そのものを消す操作は、意図的に確認が残ります。
この確認が守っているものと守らないもの
rm と rmdir に対するチェックは、コマンドの対象を実行前に読んで判定する仕組みです。取りこぼす書き方もあり、取りこぼされたコマンドには特別な扱いがありません。許可ルール、bypassPermissions、サンドボックスの自動許可のどれかが有効なら、確認なしで通ります。また、チェックの対象は rm と rmdir だけで、他の許可済みコマンドが同じパスを消すことは防げません。
確認の有無に関係なく効くのは、次の3つです。
- 一致する拒否ルール(インストールしたmodが一部の呼び出しを承認する場合は例外)
- サンドボックス。OSが書き込めるパスを制限する。ただし作業ディレクトリの削除は防げない
- strictサンドボックスモード。サンドボックス外での再試行を許さない
マウントドライブ向けの確認を外すのは、この3つで足りている環境が前提になります。外付けSSDやUSBは取り外し可能で、中身が自分以外のデータであることもある場所です。外した後も守りたい場所があるなら、拒否ルールかサンドボックスで補います。
追加ディレクトリや変数を使った書き方での落とし穴
「作業ディレクトリの外」を --add-dir で解消すると、別のcritical pathに当たることがあります。追加した作業ディレクトリは、その上の階層も含めて保護対象です。ただし対象になるのは、追加ディレクトリの下のglobだけです。
rm -rf /Volumes/USB/otherのようにディレクトリ自体を消す: 追加ディレクトリなら、このcritical path判定は起きないrm -rf /Volumes/USB/other/*のようにglobで中身を消す: 追加ディレクトリの下のglobは、critical pathとして確認される
また、Claudeがパスを変数に入れて削除する書き方をすると、マウントドライブとは別の理由で確認されます。
| 書き方 | 理由欄の系統 | 理由 |
|---|---|---|
rm -rf "$DIR"/* | 理由欄の系統critical path | 理由変数が空なら、ルートからの削除になる |
D=$(pwd); rm -rf "$D" | 理由欄の系統critical path | 理由値が作業ディレクトリを指す可能性がある |
rm -rf logs/*/* | 理由欄の系統critical path | 理由どのディレクトリに届くか、実行前に分からない |
変数が空になる場合に備える書き方として、rm -rf "${DIR:?}"/* のように変数が空ならシェルが止まる形があります。変数が普通は設定されている場合は、リテラルのパスで書きます。マウントドライブ向けの変数を設定しても、これらの確認は外れません。
bash -c '...' の中や $(...) の中に書かれた削除も、critical pathの確認は内側まで見ます。(rm -rf ~) のような入れ子の形でも、同じコマンド内の別の場所でも見つかります。ドライブ上のパスをこうした形で渡すと、理由欄がマウントドライブ向けの文言になるとは限りません。理由欄を読んで、どちらの確認かを見分けてください。
外した後にドライブを守る設定の例
マウントドライブ向けの確認は、外してよいかどうかが環境で変わります。ビルド成果物だけを置く外付けSSDなら、確認が毎回出るコストの方が目立ちます。バックアップや共有データが載ったドライブなら、確認が最後の関門になっている場合があります。
後者のドライブを守りたいときは、サンドボックスの書き込み拒否を使えます。sandbox.filesystem.denyWrite に、サンドボックス内のコマンドから書けないパスを列挙します。
{
"sandbox": {
"enabled": true,
"filesystem": {
"denyWrite": ["/Volumes/Backup"]
}
}
}サンドボックスは、既定で作業ディレクトリ、ユーザーの一時ディレクトリ、--add-dir などで追加したディレクトリに書き込めます。この設定は、それ以外の場所にあるドライブへの書き込みを、OSの境界で止める用途です。パスの先頭が / なら、ルートからの絶対パスとして扱われます。ただし作業ディレクトリ自体の削除は、サンドボックスでも防げません。
まとめ
マウントドライブの確認は、理由欄の mounted drive path という文言で見分けられます。外すなら CLAUDE_CODE_DISABLE_MOUNTED_DRIVE_RM_PROMPT=1 を、claude を起動する環境で設定します。settingsの env では効かず、実行中のセッションにも反映されません。
止めたのに確認が出るなら、作業ディレクトリ外・* つき・critical path自体のどれかです。ディレクトリの追加、* を使わない指定、承認のいずれかで対処します。WSLで組織の管理設定を使っている場合は、Windows側の管理設定をWSLに読ませるwslInheritsWindowsSettingsがあります。管理設定の env でもこの変数は無視されるので、WSL側のシェルで設定します。