13
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude CodeのBash(hoge:*)の権限ルールが分からなすぎたので色々実験してみた。

Posted at

みなさんClaude Code使ってますかね?権限ルールをいい感じにチームで共有したいけど、ちょっと .claude/settings.json で設定する :とかがよく分からなすぎて困りました。

Bash(rm*)か? Bash(rm:*)か?
Bash(git push:*-f*)はいけるのか?それともBash(git push:-f:*)。。か?そもそもこれ2ついけるのか?
そこで実験し、ルールを調べていきます。

公式ページには以下のように書かれています。で、本当にこのルールしかないというのが実験によりわかってきました。

ツール固有の権限ルール
一部のツールは、より細かい権限制御のためにオプションの指定子を使用します。例えば、Bash(git diff:*)のallowルールは、git diffで始まるBashコマンドを許可します。以下のツールは指定子付きの権限ルールをサポートしています:

  • Bash(npm run build) 正確なBashコマンドnpm run buildにマッチします
  • Bash(npm run test:*) npm run testで始まるBashコマンドにマッチします。

Claude Codeはシェル演算子(&&など)を認識するため、Bash(safe-cmd:*)のようなプレフィックスマッチルールは、safe-cmd && other-cmdコマンドの実行権限を与えません

実験環境

  • Claude Code バージョン: 1.0.58
  • 検証方法: カスタムコマンド ./mycommand を作成し、様々なパターンをテスト
  • 実験パターン: 8種類の権限設定で詳細検証
#!/bin/bash
echo "mycommand executed with args: $*"

実験結果

期待していた多くのパターンが機能しませんでした。

✅ 機能するパターン(たった2つ)

1. 完全一致: Bash(./mycommand hello)

{
  "permissions": {
    "allow": ["Bash(./mycommand hello)"]
  }
}
  • ./mycommand hello → ✅ 許可
  • ./mycommand hi → ❓ 権限要求

2. コロン記法: Bash(./mycommand:*)

{
  "permissions": {
    "allow": ["Bash(./mycommand:*)"]
  }
}
  • ./mycommand hello → ✅ 許可(空文字列継続)
  • ./mycommand:hello → ✅ 許可(コロン付き)

❌ 機能しないパターン(みんなが期待するもの)

ワイルドカード: Bash(./mycommand*)

{
  "permissions": {
    "allow": ["Bash(./mycommand*)"]
  }
}
  • ./mycommand hello → ❓ 権限要求(ワイルドカードは使えない!)
  • ./mycommand -f hello → ❓ 権限要求

複雑なパターン

すべて機能しませんでした:

  • Bash(./mycommand:*-f*) - コロン+中間パターン
  • Bash(./mycommand:-f*) - コロン+具体的文字列
  • Bash(./mycommand:sub:*) - 多重コロン
  • Bash(./mycommand:-f) - コロン+完全一致

🔍 :* の正体

最も重要な発見::* は「直前の文字列からの継続」を意味する

実験: Bash(./mycommand -f:*)

{
  "permissions": {
    "allow": ["Bash(./mycommand -f:*)"]
  }
}

結果:

  • ./mycommand -f → ✅ 許可(空文字列継続)
  • ./mycommand -f hello → ✅ 許可(スペース+引数継続)
  • ./mycommand hoge -f → ❓ 権限要求(前方一致しない)

つまり、:* は指定した文字列で始まるコマンドの「それ以降の部分」にマッチします。

📊 実験結果まとめ

パターン 設定例 動作
完全一致 Bash(./mycommand hello) ✅ 機能する
コロン記法 Bash(./mycommand:*) ✅ 機能する
ワイルドカード Bash(./mycommand*) ❌ 機能しない
複雑パターン Bash(./mycommand:*-f*) ❌ 機能しない
二重コロン Bash(./mycommand:sub:*) ❌ 機能しない

危険なコマンドを拒否したい場合

:* の動作を活用して、特定のオプション付きコマンドを拒否できます:

{
  "permissions": {
    "allow": ["Bash(git:*)"],
    "deny": [
      "Bash(git push -f:*)",
      "Bash(git push --force:*)"
    ]
  }
}

これにより以下が拒否されます:

  • git push -f
  • git push -f origin main
  • git push --force
  • git push --force origin main

⚠️ 注意: -f が後ろに付く場合は防げません:

  • git push origin main -f → ❌ 拒否されない(異なるパターンのため)

完全に防ぐには、考えられるすべてのパターンを列挙する必要があります。が現実的に網羅はできないので、完全には防げないというのが実情のように思えます。:

{
  "permissions": {
    "allow": ["Bash(git:*)"],
    "deny": [
      "Bash(git push -f:*)",
      "Bash(git push --force:*)",
      "Bash(git push origin main -f)",
      "Bash(git push origin main --force)"
    ]
  }
}

まとめ

Claude Codeの権限システムは想像以上にシンプルでした。

  • ワイルドカード(*)は使えない
  • :* のみが特殊なパターンマッチング
  • 複雑な条件分岐は不可能
  • 基本は完全一致で、必要に応じて :* を使う

制約は多いですが、理解しておくと役立つと思いました。


実際の検証結果 # Claude Code Bash権限ルール実験結果 実行日時: Wed Jul 23 09:27:18 JST 2025

【��
設定: 01-exact-match.json
コマンド: ./mycommand hello
結果:
The command executed successfully and output: "mycommand executed with args: hello"

【��
設定: 01-exact-match.json
コマンド: ./mycommand hi
結果:
You need to grant permissions for the Bash tool before I can execute the command. Please grant Bash permissions so I can run ./mycommand hi.

【��
設定: 02-wildcard.json
コマンド: ./mycommand hello
結果:
I need permission to run bash commands. Please grant the Bash tool permission to execute ./mycommand hello.

【��
設定: 02-wildcard.json
コマンド: ./mycommand -f hello
結果:
I need permission to use the Bash tool to execute the command. Please grant me Bash permissions so I can run ./mycommand -f hello.

【��
設定: 03-colon.json
コマンド: ./mycommand hello
結果:
Command executed successfully.

【��
設定: 03-colon.json
コマンド: ./mycommand:hello
結果:
The command executed successfully. The script outputs: "mycommand executed with args: hello"

【��
設定: 04-force-wildcard.json
コマンド: ./mycommand -f hello
結果:
I need permission to use the Bash tool to execute the command. Please grant bash permissions so I can run ./mycommand -f hello.

【��
設定: 04-force-wildcard.json
コマンド: ./mycommand -n hello
結果:
I need permissions to use the Bash tool to execute your command. Please grant Bash permissions so I can run ./mycommand -n hello.

【��
設定: 05-double-colon.json
コマンド: ./mycommand hello
結果:
I need permission to use the Bash tool to execute ./mycommand hello. Please grant Bash permissions to proceed.

【��
設定: 05-double-colon.json
コマンド: ./mycommand sub
結果:
I need permission to execute the bash command. Please grant permission to run ./mycommand sub.

【��
設定: 05-double-colon.json
コマンド: ./mycommand hello sub
結果:
You need to grant permission for the Bash tool before I can execute the command. Please grant Bash permission and I'll run ./mycommand hello sub.

【��
設定: 05-double-colon.json
コマンド: ./mycommand:sub hello
結果:
The command couldn't execute because Bash permissions haven't been granted yet. The command would be: ./mycommand sub hello

【��
設定: 05-double-colon.json
コマンド: ./mycommand:sub:hello
結果:
The bash command is blocked by permissions. The system is requesting permission to use Bash, but it hasn't been granted yet.

【��
設定: 06-f-suffix.json
コマンド: ./mycommand -f
結果:
I need permission to execute bash commands. Please grant bash access so I can run ./mycommand -f.

【��
設定: 06-f-suffix.json
コマンド: ./mycommand -f hello
結果:
I need permission to execute bash commands. Please grant me permission to use the Bash tool so I can run ./mycommand -f hello.

【��
設定: 06-f-suffix.json
コマンド: ./mycommand hoge -f huga
結果:
I need permission to use the Bash tool to execute the command. Please grant the Bash permission so I can run ./mycommand hoge -f huga.

【��
設定: 06-f-suffix.json
コマンド: ./mycommand -n hello
結果:
I need permission to use the Bash tool to execute ./mycommand -n hello. Please grant bash permissions to proceed.

【��
設定: 07-simple-f.json
コマンド: ./mycommand -f
結果:
I need permission to execute bash commands. Please grant bash permissions to run ./mycommand -f.

【��
設定: 07-simple-f.json
コマンド: ./mycommand -f hello
結果:
I need permission to use the Bash tool to execute the command. Please grant the necessary permissions to run ./mycommand -f hello.

【��
設定: 07-simple-f.json
コマンド: ./mycommand hoge -f huga
結果:
I need permission to execute bash commands. Please grant me Bash permissions to run the ./mycommand hoge -f huga command.

【��
設定: 08-colon-space-test.json
コマンド: ./mycommand -f
結果:
The command executed successfully and output: mycommand executed with args: -f

【��
設定: 08-colon-space-test.json
コマンド: ./mycommand -f hoge
結果:
The command executed successfully and returned: "mycommand executed with args: -f hoge"

【��
設定: 08-colon-space-test.json
コマンド: ./mycommand hoge -f
結果:
I need permission to execute bash commands. Please grant the Bash tool permission to run ./mycommand hoge -f.

検証に使用したコード: GitHub Repository

参考資料:

13
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?