claude-code-notifier
как это работает руководства вопросы
◐Русский
English العربية Deutsch Español Français עברית Italiano 日本語 한국어 Nederlands Polski Português (Brasil) Русский Türkçe Tiếng Việt 简体中文 繁體中文
Начать
Все руководства

Ответ на запросы разрешений из hook (PermissionRequest)

Обновлено 31 октября 2026 г. · 6 мин чтения
на этой странице 01PermissionRequest в сравнении с PreToolUse и Notification 02Что получает hook 03Объект decision 04Пример: автоматическое одобрение одного prompt 05Пример: решение на основе команды 06Пример: разрешить и запомнить на время сессии 07Часто правило разрешений подходит лучше 08Типичные ловушки 09Место Claude Code Notifier 10FAQ

Hook PermissionRequest в Claude Code запускается в тот момент, когда Claude Code собирается показать Вам запрос разрешения, и может ответить на него за Вас. Чтобы разрешить, hook завершается с 0 и выводит {"hookSpecificOutput": {"hookEventName": "PermissionRequest", "decision": {"behavior": "allow"}}}; чтобы запретить — использует "behavior": "deny" с message для Claude. Он фильтруется по имени инструмента, не может переопределить Ваши правила запрета, а код выхода 2 для этого события ничего не делает. Если hook не выводит решение, появляется обычный запрос.

01PermissionRequest в сравнении с PreToolUse и Notification

С разрешениями связаны три события hook, и у каждого своя задача:

СобытиеКогда срабатываетМожет ли принимать решение?
PreToolUseПеред каждым вызовом инструмента, независимо от того, нужно ли разрешениеДа: allow, deny, ask или defer
PermissionRequestТолько когда Claude Code собирается спросить ВасДа: allow или deny
Notification (permission_prompt)Когда запрос ждёт около шести секунд, пока Вас нетНет

Используйте PermissionRequest, если Вам важны сами запросы: отвечать на них, логировать или куда-то пересылать. Он срабатывает сразу, без шестисекундной задержки. Используйте PreToolUse для правил, которые должны применяться к каждому вызову, например «никогда не запускать rm -rf», потому что он срабатывает, даже когда запрос не появился бы. Тайминг этого события описан в руководстве по Notification hook.

02Что получает hook

Помимо общих полей, hook PermissionRequest получает tool_name и tool_input вызова, который хочет выполнить Claude, а также необязательный массив permission_suggestions:

{
  "session_id": "abc123",
  "cwd": "/Users/...",
  "permission_mode": "default",
  "hook_event_name": "PermissionRequest",
  "tool_name": "Bash",
  "tool_input": {
    "command": "rm -rf node_modules",
    "description": "Remove node_modules directory"
  },
  "permission_suggestions": [
    {
      "type": "addRules",
      "rules": [{ "toolName": "Bash", "ruleContent": "rm -rf node_modules" }],
      "behavior": "allow",
      "destination": "localSettings"
    }
  ]
}

permission_suggestions содержит изменения правил, которые Claude Code предложил бы для этого запроса. Это не точная копия вариантов в диалоге, поскольку каждый диалог формирует свои варианты.

03Объект decision

Верните decision внутри hookSpecificOutput:

ПолеЧто использовать
behavior"allow" или "deny"
updatedInputТолько для allow. Заменяет весь ввод инструмента, поэтому включайте и неизменённые поля
updatedPermissionsТолько для allow. Изменения разрешений, например добавление правила или смена режима
messageТолько для deny. Объясняет Claude причину
interruptТолько для deny. true также останавливает Claude

Два правила, которые стоит помнить:

  • Правила deny и ask продолжают действовать. Если hook возвращает "allow", это не отменяет подходящее правило deny в Ваших настройках, а изменённые входные данные снова проверяются по этим правилам.
  • Код выхода 2 здесь игнорируется. Для большинства событий выход с кодом 2 блокирует действие, но если hook PermissionRequest завершается с кодом 2 без объекта decision, prompt остаётся без изменений. Чтобы отклонить запрос, верните решение.

04Пример: автоматическое одобрение одного prompt

В собственном примере Anthropic автоматически одобряется ExitPlanMode — prompt, который появляется, когда Claude закончил план, чтобы Вас не спрашивали каждый раз:

{
  "hooks": {
    "PermissionRequest": [
      {
        "matcher": "ExitPlanMode",
        "hooks": [
          {
            "type": "command",
            "command": "echo '{\"hookSpecificOutput\": {\"hookEventName\": \"PermissionRequest\", \"decision\": {\"behavior\": \"allow\"}}}'"
          }
        ]
      }
    ]
  }
}

Делайте matcher как можно уже. Пустой matcher или .* в сочетании с безусловным allow одобрит любой prompt, включая запись файлов и shell-команды.

05Пример: решение на основе команды

Этот скрипт (нужен jq) отклоняет всё, что связано с git push, с пояснением, которое Claude сможет прочитать, а все остальные prompt оставляет Вам, ничего не выводя:

#!/bin/bash
# ~/.claude/hooks/permission-check.sh
input=$(cat)
cmd=$(jq -r '.tool_input.command // empty' <<<"$input")

case "$cmd" in
  *"git push"*)
    jq -nc '{hookSpecificOutput: {hookEventName: "PermissionRequest",
             decision: {behavior: "deny",
                        message: "Pushing is not allowed from this session. Commit and stop."}}}'
    ;;
esac
exit 0
{
  "hooks": {
    "PermissionRequest": [
      {
        "matcher": "Bash",
        "hooks": [{ "type": "command", "command": "~/.claude/hooks/permission-check.sh" }]
      }
    ]
  }
}

Собирайте JSON через jq, а не склейкой строк, чтобы кавычки в сообщении его не сломали. И убедитесь, что больше ничего не выводится в stdout. Если профиль Вашей оболочки печатает какую-то строку, Claude Code не прочитает решение.

06Пример: разрешить и запомнить на время сессии

Чтобы одобрить запрос и Claude больше не спрашивал до конца сессии, добавьте запись updatedPermissions с destination: "session". Hook может вернуть один из полученных permission_suggestions, изменив только destination:

#!/bin/bash
input=$(cat)
jq -c '{hookSpecificOutput: {hookEventName: "PermissionRequest",
        decision: {behavior: "allow",
                   updatedPermissions: [(.permission_suggestions // [])[]
                                        | select(.type == "addRules")
                                        | .destination = "session"]}}}' <<<"$input"

В таком виде скрипт разрешает любой запрос, поэтому используйте его с узким matcher. В качестве destination можно также указать localSettings, projectSettings или userSettings — тогда правило записывается в файл настроек, а не хранится в памяти.

07Часто правило разрешений подходит лучше

Если ответ всегда один и тот же, hook не нужен. Добавьте правило в settings.json, и Claude Code применит его, ничего не запуская:

{
  "permissions": {
    "allow": ["Bash(npm run *)"],
    "deny": ["Bash(git push *)"]
  }
}

Правила проверяются в порядке: сначала deny, затем ask, затем allow. Hook оправдан, когда решение зависит от того, чего правило не видит: времени суток, текущей ветки или человека, отвечающего откуда-то ещё. О других встроенных вариантах рассказано в статье Режимы разрешений.

08Типичные ловушки

  • Неинтерактивный запуск. При claude -p спрашивать некого. Hook'и PermissionRequest всё равно запускаются, и если ни один не вернул решение, вызов отклоняется.
  • Таймауты. По умолчанию command hook может работать до 600 секунд, и Claude ждёт. Задайте timeout (в секундах), если Ваш hook ждёт чего-то медленного, например ответа человека.
  • Не все prompt его вызывают. Сетевой запрос команды в sandbox не запускает PermissionRequest. Для этого используйте тип уведомления permission_prompt.
  • Безопасность. Hook, возвращающий "allow", одобряет действия от Вашего имени и с правами Вашего пользователя. Проверяйте его так же тщательно, как любой код, способный выполнять команды.

09Место Claude Code Notifier

Чаще всего hook PermissionRequest пишут, чтобы отвечать на prompt, когда Вас нет за клавиатурой. В самодельном варианте hook должен отправить запрос куда-то, дождаться ответа и вернуть его до таймаута. Это реально, и некоторые делают такое с помощью чат-бота.

Claude Code Notifier делает это за Вас. Его бесплатная консольная утилита ccn работает на Mac, Windows и Linux и устанавливает свои hook'и в ~/.claude/settings.json. Если сопряжено приложение для iPhone или Android, запрос разрешения приходит на телефон, и Вы можете разрешить один раз, разрешить на сессию или отклонить; ccn возвращает это решение из hook'а PermissionRequest. Если Вы печатали в последние 30 секунд, ожидания нет, и terminal спрашивает как обычно. Если Вы отошли, terminal ждёт ответа с телефона до заданного Вами предела (hold_ceiling_seconds, по умолчанию 600) и перестаёт ждать, как только Вы коснётесь клавиатуры. Это независимый продукт, не созданный Anthropic. О рабочем процессе читайте в статье одобрение разрешений с телефона, а о безопасности — в статье безопасно ли удалённое одобрение?.

10FAQ

Как автоматически одобрять разрешения с помощью hook?

Добавьте hook PermissionRequest с узким matcher, пусть он выводит JSON-решение с "behavior": "allow" внутри hookSpecificOutput и завершается с кодом 0. Если одну и ту же команду нужно разрешать всегда, проще использовать правило permissions.allow в settings.json — hook для этого не нужен.

Почему код выхода 2 не отклоняет запрос?

PermissionRequest — одно из событий, для которых выход с кодом 2 не учитывается. Claude Code его игнорирует и показывает обычный prompt. Вместо этого верните "behavior": "deny" в объекте решения.

Может ли hook PermissionRequest обойти мои правила deny?

Нет. Правила deny и ask всё равно проверяются, поэтому "allow" от hook'а не пройдёт мимо подходящего правила deny. Любой возвращённый Вами updatedInput тоже проверяется по этим правилам.

Чем PermissionRequest отличается от PreToolUse?

PreToolUse запускается перед каждым вызовом инструмента и может разрешить, отклонить, запросить подтверждение или отложить решение. PermissionRequest запускается только тогда, когда Claude Code собирается показать prompt, и может его разрешить или отклонить. Используйте PreToolUse для политик, а PermissionRequest — для ответов на prompt.

Что будет, если hook ничего не выведет?

Ничего не изменится. Claude Code покажет обычный prompt разрешения в terminal, как будто hook'а нет.

Claude Code Notifier Получайте push на телефон, когда Claude Code завершает работу или ждёт Вас, и подтверждайте, отклоняйте или отвечайте прямо оттуда. Утилита командной строки ccn бесплатна для Mac, Windows и Linux.
Скачать для iOS Скачать для Android Установить ccn

Похожие руководства

  • Одобряйте запросы разрешений Claude Code с телефонаHook PermissionRequest в Claude Code может вернуть allow или deny. Рассказываем, как отвечать на запросы разрешений с телефона — вручную или с помощью ccn.
  • Hooks в Claude Code: все события и их назначениеЧто такое hooks в Claude Code, где они задаются в settings.json, как работают matchers, входные данные и коды выхода и для чего нужно каждое событие.
  • Режимы разрешений Claude Code (default, acceptEdits, plan, bypassPermissions)Что делает каждый режим разрешений Claude Code (default, acceptEdits, plan, auto, dontAsk, bypassPermissions), как их переключать и когда каждый из них безопасен.
  • Безопасно ли одобрять действия Claude Code с телефона?Как работает удалённое одобрение в Claude Code, что может пойти не так, какие данные покидают Ваш компьютер и какие настройки обеспечивают безопасность.
claude-code-notifier

Claude Code Notifier — независимое стороннее приложение. Оно не связано с Anthropic, PBC, не одобрено и не спонсируется ею. «Claude» и «Claude Code» являются товарными знаками Anthropic, PBC.

приложения Приложение для iOS Приложение для Android ccn для macOS, Windows и Linux Все руководства
правовая информация Политика конфиденциальности Условия использования Другие языки © 2026 touchtap. Все права защищены. TouchTap Ltd зарегистрирована в Англии и Уэльсе, регистрационный номер 13942589.