CLAUDE.md に「rm -rf 禁止」と書いた。それでも不安が消えなかった。
消しておきました、と言われる前に
Claude Code は、頼めばだいたいのことをやってくれる。ファイルを作り、直し、コマンドを打つ。速い。慣れると手放せない。
こわいのは、その速さで消される側に回ったときだ。
rm -rf が通れば、フォルダはまとめて消える。ゴミ箱には入らない。git reset --hard が通れば、まだコミットしていない変更が消える。git push が通れば、手元の失敗がそのまま外に出ていく。どれも、実行されてから気づく。
自分はまだ本番を壊されたことがない。壊された話を人から聞いて、こわくなって設定を作った。だからこの記事は「事故った体験談」ではない。事故る前に何ができるかの記録だ。
CLAUDE.md に書いても、実行は止まらない
先に、一番大事な誤解をつぶしておく。
CLAUDE.md に「rm -rf は禁止」と書いても、実行そのものは止まらない。CLAUDE.md は指示書であって、実行していいかどうかを決める場所ではないからだ。
普段は守られる。ただ、会話が長くなって指示が押し出されたときや、こちらがうっかり頼んだときには、実行されてしまう。守られるかどうかが、そのときの状況に左右される。
止めたいなら、書く場所が違う。許可の設定を書くファイルに書く。 そこに書いたものは、Claude の気分とは関係なく、実行の直前に弾かれる。
この記事はそっちの話だ。お願いではなく、仕組みで止める。
まず3分。これだけで半分止まる
理屈は後まわしにして、先に動くものを作る。ここは無料で出す。実際に止まるところまで、この記事の中で確かめられる。
作業フォルダの中に .claude という名前のフォルダを作って、その中に settings.json という名前のファイルを作る。中身はこれだけ。
{
"permissions": {
"deny": [
"Bash(echo DENYTEST *)",
"Bash(git push *)",
"Bash(rm -rf *)",
"Bash(rm -f *)",
"Bash(git reset --hard *)",
"Bash(sudo *)"
]
}
}
deny は禁止リストのことだ。ここに書いたものは、実行の直前に弾かれる。
貼ったら Claude Code を一度終了して、開き直してください。 ここが最初の関門で、自分も引っかかった。設定は、それを作ったセッションには効かない。 起動したときに読み込まれるからだ。貼っただけで試して「効かない」と思ったら、たいてい再起動していない。
開き直したら、Claude にこう頼んでください。
echo DENYTEST hello をターミナルで実行してください
止まれば成功だ。「権限がない」「拒否された」という趣旨の返事が返ってくる。
1行目に入れた Bash(echo DENYTEST *) は、そのための行だ。echo は文字を表示するだけのコマンドで、何も壊さない。危険なコマンドで試さなくても、禁止リストが効いているかを確かめられる。 おとりとして置いてある。
止まらなかったら、置き場所を確認してください。.claude の前にドットが要る。ファイル名は settings.json で、setting.json ではない。それでも駄目なら、Claude Code を起動したフォルダと、ファイルを置いたフォルダが同じか確かめてください。
止まったなら、この時点で git push も rm -rf も止まっている。3分で半分は終わりだ。
入れると、確認を飛ばせるようになる
この設定の一番大きい効果は、止まることそのものではない。確認を飛ばしても平気になることだ。
Claude Code には、いちいち聞かずに進めるモードがある。速い。ただ、そのぶん何をされるか分からないので、使うのがこわい。
このモードでも禁止リストは効く。手元で確かめた。消す・巻き戻す・外に出す、だけは止まったまま残る。
つまり「速いけどこわい」が「速くて、危ないところだけ止まる」に変わる。1日に何十回も出ていた確認が、要らなくなる。
長い作業を投げて席を外せるようにもなる。戻ったら全部消えていた、が起きにくくなる。
かわりに、確認しない範囲をどこまでにするかは自分で決めることになる。禁止リストに書いていない操作は、そのまま通る。何が通るのかを、一度は自分の目で見ておいたほうがいい。 その手順も有料エリアに入れてある。
でも、これだけでは抜ける
ここからが本題になる。
上の設定を入れた状態で、自分の設定をわざと破りにいってみた。危険なコマンドは使っていない。ファイルを1つ作るだけの、無害なコマンドで試した。
git push と書けば止まる。これは確認できた。
では、丸かっこで囲むとどうなるか。
( git push )
止まらなかった。
見た目はほとんど同じなのに、素通りする。本当に実行されたのかどうかを疑ったので、実際にファイルが作られるかどうかで確かめた。丸かっこなしの形ではファイルができず、丸かっこありの形ではファイルができた。つまり中身は実行されている。
同じことが、他の書き方でも起きる。git と push の間にオプションを挟んだ形も抜けた。コマンドをクォートの中に隠した形も抜けた。頭に環境変数の代入をくっつけた形も抜けた。
禁止リストは、コマンドの形を見て判定している。だから形を少し変えられると、同じ意味なのに別物として通ってしまう。ここは禁止リストを何行増やしても塞げない。 100行書いても、200行書いても、丸かっこ1つで抜ける。
だから2枚目の網が要る。コマンドの文字の並びそのものを見て、危ないものを弾く仕組みだ。Claude Code には、コマンドを実行する直前に自分のスクリプトを呼び出す機能がある。そこに置く。
有料エリアでは、その2枚目を含めて、全部そのまま貼れる形で置いてある。
この記事に入っているもの
・そのまま貼れる禁止リスト(44行・完成品)
・2枚目の網になるスクリプト全文(104行・コピペで動く)
・それを呼び出すための設定
・本当に止まるかを、危険なコマンドを使わずに確かめる手順
・抜ける形を自分の目で見る手順
・普通の作業まで止まっていないかの確認
・うまくいかないときの対処
・全部消して元に戻す方法
・どこからは防げないか
ターミナルで打つコマンドは、コピペできる形で全部書いてある。中身を理解する必要はない。
向いていない人
先に書いておく。
Claude Code を使っていない方には役に立たない。Windows では確かめていない。ここに書いてあるのは macOS で試した結果だ。
「これを入れれば何も起きなくなる」と思って買うと、期待外れになる。防げないものがはっきりある。最後の章にそれを全部書いた。隠していない。
書いているのは文系の大学生だ。プログラミングは得意ではない。だからこそ、専門用語を使わずに済む形にしてある。逆に、仕組みを深く理解したい方には物足りないはずだ。
別に「CLAUDE.md の書き分けテンプレート」も出しているが、あちらは書き方の整理で、実行は止まらない。
ここから先が有料エリアです。
CLAUDE.md に「rm -rf 禁止」と書いた。それでも不安が消えなかった。
消しておきました、と言われる前に
Claude Code は、頼めばだいたいのことをやってくれる。ファイルを作り、直し、コマンドを打つ。速い。慣れると手放せない。
こわいのは、その速さで消される側に回ったときだ。
rm -rf が通れば、フォルダはまとめて消える。ゴミ箱には入らない。git reset --hard が通れば、まだコミットしていない変更が消える。git push が通れば、手元の失敗がそのまま外に出ていく。どれも、実行されてから気づく。
自分はまだ本番を壊されたことがない。壊された話を人から聞いて、こわくなって設定を作った。だからこの記事は「事故った体験談」ではない。事故る前に何ができるかの記録だ。
CLAUDE.md に書いても、実行は止まらない
先に、一番大事な誤解をつぶしておく。
CLAUDE.md に「rm -rf は禁止」と書いても、実行そのものは止まらない。CLAUDE.md は指示書であって、実行していいかどうかを決める場所ではないからだ。
普段は守られる。ただ、会話が長くなって指示が押し出されたときや、こちらがうっかり頼んだときには、実行されてしまう。守られるかどうかが、そのときの状況に左右される。
止めたいなら、書く場所が違う。許可の設定を書くファイルに書く。 そこに書いたものは、Claude の気分とは関係なく、実行の直前に弾かれる。
この記事はそっちの話だ。お願いではなく、仕組みで止める。
まず3分。これだけで半分止まる
理屈は後まわしにして、先に動くものを作る。ここは無料で出す。実際に止まるところまで、この記事の中で確かめられる。
作業フォルダの中に .claude という名前のフォルダを作って、その中に settings.json という名前のファイルを作る。中身はこれだけ。
deny は禁止リストのことだ。ここに書いたものは、実行の直前に弾かれる。
貼ったら Claude Code を一度終了して、開き直してください。 ここが最初の関門で、自分も引っかかった。設定は、それを作ったセッションには効かない。 起動したときに読み込まれるからだ。貼っただけで試して「効かない」と思ったら、たいてい再起動していない。
開き直したら、Claude にこう頼んでください。
止まれば成功だ。「権限がない」「拒否された」という趣旨の返事が返ってくる。
1行目に入れた Bash(echo DENYTEST *) は、そのための行だ。echo は文字を表示するだけのコマンドで、何も壊さない。危険なコマンドで試さなくても、禁止リストが効いているかを確かめられる。 おとりとして置いてある。
止まらなかったら、置き場所を確認してください。.claude の前にドットが要る。ファイル名は settings.json で、setting.json ではない。それでも駄目なら、Claude Code を起動したフォルダと、ファイルを置いたフォルダが同じか確かめてください。
止まったなら、この時点で git push も rm -rf も止まっている。3分で半分は終わりだ。
入れると、確認を飛ばせるようになる
この設定の一番大きい効果は、止まることそのものではない。確認を飛ばしても平気になることだ。
Claude Code には、いちいち聞かずに進めるモードがある。速い。ただ、そのぶん何をされるか分からないので、使うのがこわい。
このモードでも禁止リストは効く。手元で確かめた。消す・巻き戻す・外に出す、だけは止まったまま残る。
つまり「速いけどこわい」が「速くて、危ないところだけ止まる」に変わる。1日に何十回も出ていた確認が、要らなくなる。
長い作業を投げて席を外せるようにもなる。戻ったら全部消えていた、が起きにくくなる。
かわりに、確認しない範囲をどこまでにするかは自分で決めることになる。禁止リストに書いていない操作は、そのまま通る。何が通るのかを、一度は自分の目で見ておいたほうがいい。 その手順も有料エリアに入れてある。
でも、これだけでは抜ける
ここからが本題になる。
上の設定を入れた状態で、自分の設定をわざと破りにいってみた。危険なコマンドは使っていない。ファイルを1つ作るだけの、無害なコマンドで試した。
git push と書けば止まる。これは確認できた。
では、丸かっこで囲むとどうなるか。
止まらなかった。
見た目はほとんど同じなのに、素通りする。本当に実行されたのかどうかを疑ったので、実際にファイルが作られるかどうかで確かめた。丸かっこなしの形ではファイルができず、丸かっこありの形ではファイルができた。つまり中身は実行されている。
同じことが、他の書き方でも起きる。git と push の間にオプションを挟んだ形も抜けた。コマンドをクォートの中に隠した形も抜けた。頭に環境変数の代入をくっつけた形も抜けた。
禁止リストは、コマンドの形を見て判定している。だから形を少し変えられると、同じ意味なのに別物として通ってしまう。ここは禁止リストを何行増やしても塞げない。 100行書いても、200行書いても、丸かっこ1つで抜ける。
だから2枚目の網が要る。コマンドの文字の並びそのものを見て、危ないものを弾く仕組みだ。Claude Code には、コマンドを実行する直前に自分のスクリプトを呼び出す機能がある。そこに置く。
有料エリアでは、その2枚目を含めて、全部そのまま貼れる形で置いてある。
この記事に入っているもの
・そのまま貼れる禁止リスト(44行・完成品)
・2枚目の網になるスクリプト全文(104行・コピペで動く)
・それを呼び出すための設定
・本当に止まるかを、危険なコマンドを使わずに確かめる手順
・抜ける形を自分の目で見る手順
・普通の作業まで止まっていないかの確認
・うまくいかないときの対処
・全部消して元に戻す方法
・どこからは防げないか
ターミナルで打つコマンドは、コピペできる形で全部書いてある。中身を理解する必要はない。
向いていない人
先に書いておく。
Claude Code を使っていない方には役に立たない。Windows では確かめていない。ここに書いてあるのは macOS で試した結果だ。
「これを入れれば何も起きなくなる」と思って買うと、期待外れになる。防げないものがはっきりある。最後の章にそれを全部書いた。隠していない。
書いているのは文系の大学生だ。プログラミングは得意ではない。だからこそ、専門用語を使わずに済む形にしてある。逆に、仕組みを深く理解したい方には物足りないはずだ。
別に「CLAUDE.md の書き分けテンプレート」も出しているが、あちらは書き方の整理で、実行は止まらない。
ここから先が有料エリアです。