
Claude Codeのスキル内インラインシェル実行もBashツールと同じくpermissionsチェックを通る
Claude Codeのスキルやカスタムコマンドには、Markdownファイルにシェルコマンドを埋め込んで、その場で実行させる記法があります(!`command`、```! コードブロック)。
この記法について、スキルで Claude を拡張する | Claude Code Docsには以下の記載がありました。
これは前処理であり、Claude が実行するものではありません。Claude は最終結果のみを見ます。
ここでの「Claude」はモデルを指しています。実行するのはClaude Code本体で、モデルがBashツールとして呼び出すわけではありません。だとすると、ツール呼び出しを対象とするpermissions(ask/deny)の許可チェックも及ばないのではないかと考えました。
ドキュメントからは、この実行が許可チェックを経由するかどうかの記載は見つけられませんでした。
実際に確認したところ、経由していました。
検証用のスキルを作って呼び出す
検証用プロジェクトを用意し、.claude/settings.jsonでtouchコマンドを拒否します。
{
"permissions": {
"deny": [
"Bash(touch:*)"
]
}
}
テスト用スキルの本文には、インラインシェル構文でtouchコマンドを埋め込みました。
---
name: shell-test
description: インラインシェル実行のテスト用スキル。permissionsチェックの検証で使う。
---
# シェルテストスキル
このスキルはインラインシェル構文の検証用です。
実行結果: !`touch marker_via_skill.txt && echo created`
スキルを呼び出します。
shell-test スキルを実行して
返答としてエラーメッセージが返ってきました。
Using shell-test skill to インラインシェル実行のテストを実行します。
⏺ Skill(shell-test)
Initializing…
Error: Shell command permission check failed for pattern "!`touch marker_via_skill.txt && echo created`": Permission to use Bash with command touch marker_via_skill.txt && echo created has been denied.
shell-testスキルを実行しましたが、権限が拒否されました。
結果: スキル内のインラインシェル実行部分(!touch marker_via_skill.txt && echo created``)が、現在のパーミッション設定によって拒否されました。
Permission to use Bash with command touch marker_via_skill.txt && echo created has been denied.
これはスキル自体の不具合ではなく、このセッションのパーミッションモードで touch を含むBashコマンドが許可されていないことが原因です。これがpermissionsチェックの検証を目的としたテスト用スキルなので、「拒否される」という結果自体が想定通りの動作の可能性があります。
このまま実行させたい場合は、パーミッションモードを変更するか、該当コマンドを許可リストに追加する必要があります。続けますか?
インラインシェル実行を丸ごと止める設定もある
permissions.denyとは別に、インラインシェル実行そのものを止める設定もあります。
Claude Code の設定によると、disableSkillShellExecution: trueを設定した場合の挙動は次の通りです。対象となるのは、ユーザー、プロジェクト、プラグイン、追加ディレクトリのスキルやカスタムコマンドです。これらのインラインシェル構文が[shell command execution disabled by policy]という固定文字列に置き換わります。
実際に試した結果は以下です。
{
"disableSkillShellExecution": true
}
shell-test スキルを実行して
Using shell-test skill to run this test.
⏺ Skill(shell-test)
Successfully loaded skill
shell-testスキルを実行しました。結果は以下の通りです。
▎ 実行結果: [shell command execution disabled by policy]
スキル内のインラインシェルコマンドはポリシーによりブロックされ、実行されませんでした。これはpermissionsチェックの検証用スキルなので、この結果自体が想定通りの検証結果と思われます。
ちなみに、バンドルされたスキルと管理スキルはこの設定の対象外です。管理設定で設定した場合、ユーザーはオーバーライドできません。
おわりに
インラインシェル構文もBashツール呼び出しと同じくpermissionsチェックを通ることが分かりました。スキルにインラインシェル構文を書くときも、他のBashコマンドと同じ権限設定でカバーできます。
信頼しきれないスキルを使う場合や非対話実行など、denyリストのすり抜けを気にしたくない場面では、disableSkillShellExecutionで丸ごと止めておくのも一案です。








