Почему Claude Code спрашивает разрешение на каждую команду
По умолчанию Claude Code работает в «безопасном режиме»: перед каждой командой, которая потенциально может изменить что-то в системе, он останавливается и спрашивает подтверждение. Это сделано специально — чтобы вы контролировали что происходит.
Звучит разумно, но на практике если вы работаете с git, деплоите на Vercel, запускаете скрипты — диалог Allow вылезает каждые 30 секунд. Это разрушает поток работы и превращает вайбкодинг в клик-фест.
Решение — файл settings.json, в котором вы явно прописываете какие команды Claude Code может выполнять без вашего подтверждения.
Два уровня настроек: проектный и глобальный
В Claude Code есть два места где можно прописать разрешения:
Проектный settings.json — файл внутри конкретного проекта. Применяется только когда Claude Code запущен из этой папки:
ваш-проект/
└── .claude/
└── settings.json
Глобальный settings.json — файл в домашней папке пользователя. Применяется ко всем проектам:
~/.claude/settings.json
Если оба файла существуют — проектный имеет приоритет. Это удобно: в глобальном можно разрешить базовые команды (git, curl), а в проектном добавить специфику конкретного проекта (например, команды деплоя).
Формат permissions.allow
Структура файла простая:
{
"permissions": {
"allow": [
"Bash(команда *)",
"Bash(другая команда *)"
],
"deny": []
}
}
Паттерны в allow могут быть трёх видов:
Точное совпадение — разрешает только эту конкретную команду:
"Bash(git status)"
С wildcard * — разрешает команду с любыми аргументами. Важно: пробел перед звёздочкой обязателен:
"Bash(git push *)"
Широкий wildcard — разрешает весь инструмент целиком:
"Bash(vercel *)"
Чем шире паттерн — тем больше разрешено. Используйте широкие паттерны только для инструментов, которым доверяете.
Готовый конфиг для типичного проекта с деплоем
Если вы работаете с git, Vercel, npm и запускаете Python/Node скрипты — вот конфиг который закрывает 95% диалогов Allow. Создайте файл .claude/settings.json в корне проекта:
{
"permissions": {
"allow": [
"Bash(git add *)",
"Bash(git commit *)",
"Bash(git push *)",
"Bash(git pull *)",
"Bash(git rebase *)",
"Bash(git checkout *)",
"Bash(git stash *)",
"Bash(git merge *)",
"Bash(vercel *)",
"Bash(curl -s *)",
"Bash(curl -sL *)",
"Bash(curl -sI *)",
"Bash(gh workflow run *)",
"Bash(gh run rerun *)",
"Bash(npm run *)",
"Bash(npm install *)",
"Bash(pip3 install *)",
"Bash(open *)",
"Bash(mkdir -p *)",
"Bash(cp *)",
"Bash(rsync *)"
]
}
}
Создать файл можно прямо из Claude Code — просто попросите его: «создай .claude/settings.json с разрешениями для git, vercel и npm».
Глобальный конфиг — один раз для всех проектов
Если хотите настроить один раз и забыть — создайте глобальный файл ~/.claude/settings.json. Он применится ко всем проектам автоматически.
Откройте терминал и создайте файл:
mkdir -p ~/.claude
nano ~/.claude/settings.json
Вставьте содержимое (то же что выше) и сохраните. Теперь во всех проектах Claude Code будет работать без прерываний на эти команды.
Проверить что файл создан правильно:
cat ~/.claude/settings.json
Что НЕ стоит разрешать — список опасных паттернов
Не все команды одинаково безопасны. Вот что я бы не стал добавлять в allow:
Bash(rm *) или Bash(rm -rf *) — удаление файлов без подтверждения. Если Claude Code случайно снесёт нужную папку — вы не успеете остановить.
Bash(sudo *) — команды с правами администратора. Слишком широко.
Bash(python3 *) — любой Python скрипт. Лучше указать конкретный: Bash(python3 scripts/*).
Bash(ssh *) — SSH подключения. Лучше разрешать конкретный хост.
Общее правило: чем конкретнее паттерн — тем лучше. Bash(git push origin main) безопаснее чем Bash(git *).
Больше про Claude Code — в канале
Разбираю реальные сценарии использования Claude Code: как настраивать, автоматизировать деплои, писать скрипты и строить продукты без команды разработчиков.
Подписаться →Режимы разрешений: accept edits, plan mode и bypass
Кроме файла настроек у Claude Code есть режимы работы, которые переключаются на лету клавишей Shift+Tab прямо в диалоге. Это самый быстрый способ перестать жать Allow, если лезть в JSON не хочется.
Normal — режим по умолчанию: спрашивает подтверждение на каждое изменение файла и каждую команду, кроме тех, что перечислены в permissions.allow.
Accept edits — правки файлов применяются без вопросов, но команды в терминале по-прежнему требуют подтверждения. Рабочий компромисс длядлинных сессий рефакторинга: файлы под git, откатить не проблема, а вот запуск скриптов остаётся под контролем.
Plan mode — Claude Code ничего не меняет вообще, только исследует проект и предлагает план. Полезен, когда нужно сначала понять, что вообще будет сделано.
Режим виден в статусной строке внизу окна. Он живёт в рамках одной сессии: перезапустили claude — вернулись в normal. Если хотите, чтобы поведение сохранялось между запусками, это уже про settings.json из разделов выше.
Флаг --dangerously-skip-permissions: когда можно и чем рискуете
Есть способ отключить запрос разрешений полностью — запустить Claude Code с флагом:
claude --dangerously-skip-permissions
В этом режиме не будет ни одного подтверждения: ни на правку файлов, ни на команды в терминале, ни на удаление. Название флага не случайно содержит слово dangerously — это ровно то, чем оно выглядит.
Когда это оправданно: изолированная песочница, контейнер или временная копия проекта, где нечего терять; длинная автономная задача, которую вы запускаете осознанно и потом проверяете результат по git diff.
Когда так делать не стоит: рабочий проект без коммита, каталог с ключами и .env, домашняя директория, продакшен-сервер по SSH. Одна неудачно составленная команда rm — и восстанавливать будет нечего.
permissions.allow под конкретные команды, это займёт пять минут и закроет 90% прерываний.permissions.deny: запретить точечно вместо «разрешить всё»
Обратная сторона allow — блок deny. Он работает жёстче: команда из deny не будет выполнена, даже если вы подтвердите её вручную. Это страховка от собственной невнимательности, когда рука уже автоматически жмёт Enter.
{
"permissions": {
"allow": [
"Bash(git *)",
"Bash(npm run *)"
],
"deny": [
"Bash(rm -rf *)",
"Bash(sudo *)",
"Read(.env)",
"Read(**/*.key)"
]
}
}
Обратите внимание на две последние строки: deny умеет закрывать не только команды, но и чтение файлов. Запретив Read(.env), вы гарантируете, что содержимое файла с ключами не попадёт в контекст модели — даже если попросить об этом напрямую.
Комбинация «широкий allow + узкий deny» работает лучше, чем попытка перечислить все безопасные команды: разрешаете рабочие инструменты целиком, а точечно закрываете то, что не должно выполняться никогда.
Что делать, если настройки не применились
Самая частая причина — Claude Code читает настройки при старте сессии. Отредактировали файл в соседнем окне, а текущая сессия работает со старой конфигурацией. Выйдите из claude и запустите заново.
Вторая причина — синтаксическая ошибка в JSON: лишняя запятая после последнего элемента массива, кавычки-ёлочки вместо прямых, забытая скобка. Проверить можно одной командой:
python3 -m json.tool ~/.claude/settings.json
Если файл валиден, команда напечатает его содержимое; если нет — покажет строку с ошибкой.
Третья причина — паттерн не совпадает с реальной командой. Разрешение Bash(git push) не покроет git push origin main: нужна звёздочка — Bash(git push *). Проще всего посмотреть, какую именно команду Claude Code просит подтвердить, и скопировать её начало в паттерн.
Частые вопросы
~/.claude/settings.json (тильда это ваша домашняя папка, например /Users/имя/). Проектный — .claude/settings.json внутри папки проекта. Если оба существуют — проектный имеет приоритет.deny. Например, "Bash(rm *)" в deny гарантирует что Claude Code никогда не запустит rm, даже если вы случайно об этом попросите."Bash(git push origin main)". Это разрешит только пуш в main на origin, всё остальное по-прежнему будет спрашивать подтверждение.Внедряйте нейросети в маркетинг вместе с нами
В комьюнити 400+ маркетологов делятся кейсами и туториалами по Claude Code, Яндекс.Директ, автоматизации и другим инструментам.
Вступить бесплатно