Claude Code の settings.local.json に許可ルールが879件溜まっていた
Claude Code でコマンドの実行確認が出たとき、「Yes, and don’t ask again」を選ぶと、そのコマンドが許可ルールとして保存されます。保存先はリポジトリの .claude/settings.local.json です(git には入らないファイルです)。
便利なので気軽に選んでいたら、いつの間にか大量に溜まっていました。手元の10リポジトリ分を数えてみます。
環境:Windows 10 / Claude Code 2.1.302
数えてみた
各リポジトリの .claude/settings.local.json の permissions.allow を、Python で集計しました。
| リポジトリ | 許可ルール | うち一回限り | うちワイルドカード付き |
|---|---|---|---|
| A(ブログ運用・GCP) | 376 | 285 | 58 |
| B(VST プラグイン) | 104 | 59 | 31 |
| C(Web アプリ) | 97 | 68 | 17 |
| D(VST プラグイン) | 88 | 71 | 10 |
| E(Windows アプリ) | 73 | 51 | 18 |
| F〜J(5リポジトリ) | 141 | 74 | 57 |
| 合計 | 879 | 608 | 191 |
「一回限り」は、* を含まず、コマンドを丸ごと書いたルールです。同じコマンドをもう一度打たない限り、二度と使われません。
ほかにも、こんなものがありました。
- 120文字を超えるルールが151件。長いワンライナーがそのまま保存されている
- 改行を含むルールが6件。複数行のスクリプトがまるごと1件のルールになっている
- 135件は、グローバル設定(
~/.claude/settings.json)の許可とかぶっている。あとからグローバルにBash(python *)などを足したので、もう要らないルールです
ツール別では、832件が Bash でした。
何が溜まっていたか
一回限りのルールを、種類ごとに分けるとこうなりました。
| 種類 | 件数 | 例 |
|---|---|---|
| PID を指定した kill | 13 | kill 1751、taskkill //PID 13980 //F |
| 行範囲を指定した sed | 9 | sed -n '466,561p' public/script.test.js |
| 一時ファイルの削除 | 26 | rm -f _tmp_check.py |
| パイプの断片 | 47 | awk '{print $1}'、cat、break、disown |
| ssh / scp(接続先込み) | 10 | 接続先の IP・ユーザー名・鍵のパスがそのまま入っている |
| 環境変数込み | 3 | ANTHROPIC_API_KEY=dummy-... node app.js |
| その他 | 526 | 一度だけ打った確認用のコマンドなど |
PID や行番号は毎回変わるので、同じルールが二度使われることはまずありません。
「パイプの断片」は、パイプや ; でつないだコマンドを許可したときに、つないだ部分ごとにルールが保存されたもののようです。Bash(break) や Bash(cat) だけのルールがあって、最初は何かと思いました。
気になったのは ssh / scp です。サーバーの IP アドレス、ユーザー名、秘密鍵のパスが平文で残っていました。git に入らないファイルとはいえ、こういう情報が散らばっているのはうれしくありません。
溜まると何が困るか
- 何を許可しているのか、読んでも分からない。879件を眺めて危ないルールを探すのは無理があります
- 必要な許可が埋もれる。本当に残したいのはワイルドカード付きの191件のほうです
- リポジトリごとにばらばら。同じ
gcloudの許可が、リポジトリごとに少しずつ違う形で入っています
整理の方針
整理するときは、次の順に考えるつもりです。
- 一回限りのルールは消す。PID・行番号・一時ファイル名が入ったものは、残しても二度と使いません
- どのリポジトリでも使うものはグローバルへ。
Bash(git *)やBash(python *)のように、どこでも許可したいものは~/.claude/settings.jsonに1回だけ書きます - リポジトリ固有のものだけを残す。そのリポジトリでしか使わないコマンドを、ワイルドカード付きの形で残します
- 接続先が入ったルールは消す。ssh / scp は毎回確認されても困らないので、許可しないことにします
ただし、広すぎる許可ルールには注意が要ります。auto mode では Bash(python *) のような広いルールが無視される場合があることを、auto mode の拒否を集計した記事で書きました。「全部ワイルドカードにすれば解決」とはなりません。
溜めないために
一番効くのは、一回限りのコマンドで「今後は確認しない」を選ばない ことです。
確認が出たときに、次にまた同じ形で打つかどうかを考えます。kill 1751 は二度と打たないので「Yes」(今回だけ許可)で十分です。何度も出るコマンドなら、自分で Bash(gcloud run services describe *) のような汎用の形にしてから足します。
Claude Code には、会話ログを見て読み取り専用のコマンドの許可リストを提案してくれる /fewer-permission-prompts というスキルもあります。溜まったものを消すのではなく、最初からまとまった形で足したいときに使えます。
まとめ
- 「今後は確認しない」を選ぶたびに、
settings.local.jsonにコマンドがそのまま足される - 10リポジトリで879件、うち608件は二度と使わない一回限りのルールだった
- 接続先の IP や鍵のパスが入ったルールも残っていた
- 一回限りのコマンドには「今回だけ許可」を使い、繰り返すものだけを汎用の形で足す
参考文献
この記事をシェア