Настройка разрешений
Контролируйте, что Claude Code может использовать и делать, с помощью детальных правил разрешений, режимов и управляемых политик.
Claude Code поддерживает детальные разрешения, позволяя вам точно указать, что агент может делать и что он не может. Параметры разрешений можно добавить в систему контроля версий и распространить среди всех разработчиков в вашей организации, а также настроить отдельными разработчиками.
Система разрешений
Claude Code использует многоуровневую систему разрешений для баланса между мощностью и безопасностью. В таблице показано, для каждого типа инструмента, запрашивает ли режим Manual одобрение перед выполнением действия. Другие режимы разрешений изменяют, какие из них вас спрашивают; в автоматическом режиме классификатор проверяет действия вместо вас, и как классификатор оценивает действия перечисляет, какие из них он видит.
| Тип инструмента | Пример | Требуется одобрение | Поведение "Да, не спрашивать снова" |
|---|---|---|---|
| Только чтение | Чтение файлов, Grep | Нет, в пределах рабочего каталога и дополнительных каталогов | Н/А |
| Bash команды | Выполнение оболочки | Да, кроме встроенного набора команд только для чтения | Постоянно для каждого репозитория и команды |
| Изменение файлов | Edit/Write файлы | Да | До конца сеанса |
| Веб-выборка | WebFetch | Да, кроме встроенного набора предварительно одобренных доменов документации | Постоянно для каждого репозитория и домена |
| Веб-поиск | WebSearch | Да | Постоянно для каждого репозитория |
Когда вы выбираете "Да, не спрашивать снова" и одобрение сохраняется постоянно, например для команды Bash или домена WebFetch, Claude Code сохраняет правило в .claude/settings.local.json в корне git репозитория, разрешённого через worktrees к основной копии. Правило применяется к будущим сеансам в любом месте этого репозитория, включая сеансы, запущенные в подкаталогах и в worktrees. Одобрение изменения файла не сохраняется в файл: как показано в таблице, оно действует до конца сеанса. В некоторых случаях, например вне git репозитория или на Windows, Claude Code не использует корень репозитория; Где Claude Code ищет каждый файл перечисляет эти случаи и где вместо этого сохраняется правило.
До версии 2.1.211 Claude Code всегда сохранял правило в начальном каталоге, поэтому одобрение, предоставленное в worktree или подкаталоге, не применялось к остальной части репозитория. Правила, которые более ранние версии сохранили в подкаталоге или worktree, по-прежнему применяются к сеансам, запущенным там.
Иногда запрос разрешения предлагает только одноразовое одобрение, без опции "не спрашивать снова" и без опции разрешить действие на остаток сеанса. Claude Code предлагает эти опции только когда запрос может показать вам всё, что они позволили бы, поэтому правило, которое вы сохраняете из запроса, охватывает только то, что названо его опцией. Когда запрос предлагает только одноразовое одобрение, одобрите действие один раз или добавьте правило самостоятельно в /permissions.
Добавьте комментарий при ответе на запрос разрешения
Вы можете прикрепить заметку к Claude при одобрении или отклонении одного действия. На большинстве запросов разрешений, включая Bash, PowerShell, файл и запросы инструментов MCP, перейдите на Yes или No и нажмите Tab для открытия поля комментария на этой опции. Запросы WebFetch и браузера не предлагают это поле. Опции, которые разрешают действие на остаток сеанса или сохраняют правило, также не принимают его.
С открытым полем введите комментарий и затем нажмите одну из этих клавиш:
Enter: отправляет ваш ответ с прикреплённым комментарием. Если вы оставите поле пустым, Claude Code отправляет ответ без комментария.Tab: закрывает поле без ответа. Claude Code сохраняет введённый вами текст и всё ещё отправляет его, если вы ответите с этой опцией.Shift+Tab: на запросе файла, например запросе Edit или Write, закрывает поле так же, какTab. До версии 2.1.235 нажатиеShift+Tabвнутри поля вместо этого выбирало опцию, которая разрешает действие на остаток сеанса, поэтому Claude Code одобрял действие на остаток сеанса и отбрасывал комментарий.
Claude Code доставляет комментарий по-разному в зависимости от того, как вы ответили:
- Yes: Claude Code выполняет действие, затем отправляет ваш комментарий Claude после результата.
- No: Claude Code отправляет ваш комментарий Claude как причину отклонения, и Claude продолжает работу. Если вы выберете No без комментария на запрос из основного разговора, Claude Code останавливает ход.
Управление разрешениями
Вы можете просматривать и управлять разрешениями инструментов Claude Code с помощью /permissions. Этот интерфейс отображает все правила разрешений и файлы settings.json, из которых они берутся. Вы можете открыть этот интерфейс во время работы Claude: когда вы добавляете или удаляете правило, Claude Code применяет изменение начиная со следующего вызова инструмента Claude в том же ходу. До версии 2.1.234 Claude Code ставил команду в очередь до завершения хода.
- Правила Allow позволяют Claude Code использовать указанный инструмент без ручного одобрения.
- Правила Ask запрашивают подтверждение каждый раз, когда Claude Code пытается использовать указанный инструмент.
- Правила Deny предотвращают использование Claude Code указанного инструмента.
Правила оцениваются по порядку: deny, затем ask, затем allow. Первое совпадающее правило в этом порядке определяет результат, и специфичность правила не изменяет порядок.
Широкое правило deny, такое как Bash(aws *), блокирует каждый совпадающий вызов, включая вызовы, которые также совпадают с более узким правилом allow, таким как Bash(aws s3 ls). Правило allow не может создать исключение из правила deny. Тот же приоритет применяется между ask и allow: совпадающее правило ask выдает запрос даже когда более специфичное правило allow также совпадает с тем же вызовом.
Правила Deny ведут себя по-разному в зависимости от того, называют ли они инструмент или определяют область действия шаблона внутри него. Простое имя инструмента, такое как Bash, удаляет инструмент из контекста Claude полностью, поэтому Claude его никогда не видит. Если вы добавите такое правило во время сеанса, Claude не сможет вызвать инструмент со своего следующего вызова инструмента; Отказ от целого инструмента описывает, что происходит с определением, которое Claude уже видел. Правило с областью действия, такое как Bash(rm *), оставляет инструмент доступным и блокирует совпадающие вызовы, когда Claude пытается их выполнить.
Удаление по простому имени применяется ко всем инструментам, кроме EndConversation: правило deny не может удалить его, пока остается любой другой инструмент, и правило ask никогда не выдает запрос для него.
Правила разрешений применяются Claude Code, а не моделью. Инструкции в вашем приглашении или CLAUDE.md определяют, что Claude пытается делать, но они не изменяют то, что позволяет Claude Code. Чтобы предоставить или отозвать доступ, используйте /permissions, правила, описанные здесь, режим разрешений или hook PreToolUse.
Когда автоматический режим доступен для вашего сеанса, интерфейс также включает правила классификатора автоматического режима. Выберите вкладку Auto mode, чтобы просмотреть их.
Режимы разрешений
Claude Code поддерживает несколько режимов разрешений, которые контролируют, как он одобряет вызовы инструментов. См. Permission modes для определения того, когда использовать каждый из них. Чтобы изменить режим, в котором начинаются сеансы, установите defaultMode в ваших файлах параметров. Which mode a session starts in охватывает встроенное значение по умолчанию для каждого плана и то, что читает расширение VS Code.
| Режим | Описание |
|---|---|
default |
Запрашивает разрешение при первом использовании каждого инструмента. Обозначается как Manual в CLI, расширениях VS Code и JetBrains, а также в приложении для рабочего стола, и Claude Code принимает manual как псевдоним. Метка и псевдоним требуют Claude Code v2.1.200 или более поздней версии. Метка приложения для рабочего стола не зависит от вашей версии CLI |
acceptEdits |
Автоматически принимает редактирование файлов и общие команды файловой системы, такие как mkdir, touch, mv и cp для путей в рабочем каталоге или additionalDirectories |
plan |
Claude читает файлы и запускает команды оболочки только для чтения для исследования, но не редактирует ваши исходные файлы; с доступным режимом auto также запускаются одобренные классификатором команды. Обозначается как Plan в CLI и расширении VS Code |
auto |
Автоматически одобряет вызовы инструментов с проверками безопасности в фоне, которые проверяют, соответствуют ли действия вашему запросу |
dontAsk |
Автоматически отклоняет каждый вызов, который иначе запросил бы подтверждение; чтение файлов в ваших рабочих каталогах и другие действия, которые не требуют одобрения, по-прежнему выполняются, как и инструменты, предварительно одобренные через /permissions или правила permissions.allow. AskUserQuestion, инструменты MCP, отмеченные requiresUserInteraction, и инструменты соединителя установленные вашей организацией на ask в сеансах, где эта настройка достигает Claude Code, отклоняются даже если вы их разрешили |
bypassPermissions |
Пропускает запросы разрешений, за исключением действий, которые ни один режим не одобряет автоматически |
В режиме bypassPermissions Claude Code пропускает запросы разрешений, включая записи в защищённые пути такие как .git и .claude. Защита от обмена сообщениями между сеансами по-прежнему применяется. Используйте этот режим только в изолированных средах, таких как контейнеры или виртуальные машины, где Claude Code не может причинить вред.
Чтобы предотвратить использование режима bypassPermissions или auto, установите permissions.disableBypassPermissionsMode или permissions.disableAutoMode на "disable" в любом файле параметров. Это наиболее полезно в управляемых параметрах, где они не могут быть переопределены.
Синтаксис правил разрешений
Правила разрешений следуют формату Tool или Tool(specifier). Скобки внутри спецификатора являются буквальными, поэтому команда или путь, содержащие их, не требуют экранирования.
Совпадение всех использований инструмента
Чтобы совпадать со всеми использованиями инструмента, используйте только имя инструмента без скобок:
| Правило | Эффект |
|---|---|
Bash |
Совпадает со всеми Bash командами |
WebFetch |
Совпадает со всеми запросами веб-выборки |
Read |
Совпадает со всеми чтениями файлов |
Bash(*) эквивалентен Bash и совпадает со всеми Bash командами. Как правило отказа, обе формы удаляют инструмент из контекста Claude.
Используйте спецификаторы для детального контроля
Добавьте спецификатор в скобках, чтобы совпадать с конкретными использованиями инструмента:
| Правило | Эффект |
|---|---|
Bash(npm run build) |
Совпадает с точной командой npm run build |
Read(./.env) |
Совпадает с чтением файла .env в текущем каталоге |
WebFetch(domain:example.com) |
Совпадает с запросами выборки на example.com |
Совпадение по входному параметру
Правила отказа и запроса могут совпадать с параметром верхнего уровня на любом встроенном инструменте с помощью Tool(param:value).
Чтобы совпадать с параметром на инструменте MCP, передайте правило отказа с --disallowedTools. Когда Claude Code загружает файл параметров, он пропускает любое правило mcp__, которое содержит скобки. Claude Code перечисляет пропущенное правило в диалоге invalid-settings при запуске интерактивного сеанса и в выводе claude doctor.
Правило параметра совпадает, когда Claude вызывает инструмент с этим параметром, установленным на это точное значение. Правило разрешения для одного значения параметра не установило бы, что вызов безопасен в целом, поэтому правила разрешения продолжают использовать собственный синтаксис спецификатора каждого инструмента. Это работает для любого скалярного параметра, который принимает инструмент:
| Правило | Совпадает |
|---|---|
Agent(model:opus) |
Вызовы Agent, которые запрашивают уровень модели Opus |
Agent(isolation:worktree) |
Вызовы Agent, которые запрашивают git worktree |
Bash(run_in_background:true) |
Вызовы Bash, которые выполняются в фоновом режиме |
Совпадение параметров следует этим правилам:
- Имя параметра должно быть прямым полем входа инструмента, таким как
modelна инструменте Agent. Поля, вложенные внутри объекта или массива, не совпадают - Каждое правило называет один параметр. Чтобы ограничить как
model, так иisolation, напишите два правила,Agent(model:opus)иAgent(isolation:worktree), вместо того чтобы объединять их в одно правило - Значение поддерживает
*как подстановочный символ, который совпадает с любой последовательностью символов, поэтомуAgent(isolation:*)совпадает с любым явным значением изоляции. Без*совпадение точное - Параметр, который модель опускает, никогда не совпадает, поэтому
Agent(model:*)не совпадает с вызовом, который оставляетmodelнеустановленным - Значение сравнивается с буквальным входом, который отправляет Claude, до любой нормализации.
Agent(model:opus)совпадает с псевдонимомopus, но не с полным ID модели. Запустите с--verbose, чтобы увидеть точные имена параметров и значения в каждом вызове инструмента - Пробелы вокруг двоеточия игнорируются
Вы не можете совпадать с основным полем содержимого инструмента таким образом: command для Bash и PowerShell, file_path для Read, Edit и Write, path для Grep и Glob, notebook_path для NotebookEdit и url для WebFetch. Правило, такое как Bash(command:rm *), можно было бы обойти составной командой, поэтому Claude Code игнорирует его и выдает предупреждение при запуске. Используйте Bash(rm *), Read(./path) или WebFetch(domain:host) вместо этого.
Шаблоны подстановочных символов
* в правиле Bash совпадает с любым текстом, включая пробелы, поэтому одно правило охватывает семейство команд. Правило без * совпадает с одной точной командой.
Поместите * после подкоманды. В git log --oneline main, git — это программа, а log — подкоманда, слово, которое определяет, что делает программа. Claude Code совпадает со всем перед первым * в точности, поэтому эти слова — это то, что ограничивает правило: Bash(git log *) разрешает только команды git log, а Bash(git *) разрешает каждую команду git. Claude Code предупреждает при запуске о правиле разрешения с * перед подкомандой, таком как Bash(git * main).
Напишите команду, которую вы хотите, чтобы Claude выполнил без запроса, и замените части, которые варьируются, на *. С этой конфигурацией Claude Code запускает npm скрипты и git коммиты без запроса и отказывает в командах, которые начинаются с git push. Push, написанный другим способом, такой как git -C . push, не совпадает; см. что правило Bash не совпадает.
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git commit *)"
],
"deny": [
"Bash(git push *)"
]
}
}
* может находиться в любом месте правила: в начале, в середине или в конце. Каждая строка показывает правило, команды, которые оно совпадает, и близлежащие команды, которые оно не совпадает:
| Вы пишете | Совпадает | Не совпадает |
|---|---|---|
Bash(npm run build) |
npm run build |
npm run build --watch |
Bash(npm run *) |
npm run build, npm run test --watch, npm run |
npm install |
Bash(git log * main) |
git log --oneline main, git log -5 main, git log --output=<file> main |
git log main, git push origin main |
Bash(git * main) |
git merge main, git push origin main, git -c core.fsmonitor=<script> diff main |
git log |
Bash(* --version) |
node --version, bash -c 'echo hi' --version |
node -v |
Bash(ls *) |
ls -la, ls |
lsof |
Bash(ls*) |
ls -la, lsof |
|
Bash(* --help *) |
npm --help x |
npm --help |
Три правила совпадения производят эти строки:
*стоит вместо того, какой текст находится на его месте. ВBash(git * main), он стоит вместо подкоманды, поэтому Claude Code совпадает с каждой подкомандой git и каждой опцией перед ней. Это включает-c, что заставляет git запустить программу, которую вы называете. ВBash(* --version),*стоит вместо программы, поэтому совпадает любая программа.*в конце, с пробелом перед ним, также совпадает с голой командой.Bash(ls *)совпадает сls, иBash(git log *)совпадает сgit log. Это верно только когда завершающий*— единственный подстановочный символ правила:Bash(* --help *)совпадает сnpm --help x, но не сnpm --help.- Пробел перед завершающим
*является частью правила.Bash(ls *)требует пробел послеls, поэтомуlsofне совпадает.Bash(ls*)не имеет пробела, поэтому он совпадает сlsofтоже.
Суффикс :* — это эквивалентный способ написания завершающего подстановочного символа, поэтому Bash(ls:*) совпадает с теми же командами, что и Bash(ls *).
Диалог разрешений записывает форму, разделенную пробелами, когда вы выбираете "Да, не спрашивать снова" для префикса команды. Форма :* распознается только в конце шаблона. В шаблоне, таком как Bash(git:* push), двоеточие рассматривается как буквальный символ и не будет совпадать с git командами.
Подстановочные символы имён инструментов
Правила отказа и запроса также принимают glob-шаблоны в позиции имени инструмента. Шаблон должен совпадать с полным именем инструмента: "*" совпадает с каждым инструментом, и "mcp__*" совпадает с каждым MCP инструментом на всех серверах. Инструмент, совпадающий с правилом отказа с простым именем glob, удаляется из контекста Claude, так же как и простое имя инструмента, включая исключение EndConversation: glob отказ не может удалить его, пока остается любой другой инструмент, и glob запрос никогда не запрашивает его. Эта конфигурация отрицает каждый MCP инструмент:
{
"permissions": {
"deny": [
"mcp__*"
]
}
}
Правила разрешения принимают glob-шаблоны имён инструментов только после буквального префикса mcp__<server>__. Сегмент сервера должен быть свободен от glob, поэтому правило называет конкретный сервер, который вы настроили. mcp__puppeteer__* совпадает с каждым инструментом с сервера puppeteer, и mcp__github__get_* совпадает с его инструментами get_. Неякорированный glob разрешения, такой как "*", "B*" или "mcp__*", пропускается с предупреждением и не одобряет ничего автоматически.
Правило отказа или запроса, имя инструмента которого не совпадает ни с одним известным инструментом, выдает предупреждение при запуске, чтобы поймать опечатки. Имена инструментов, содержащие _ или *, освобождаются от проверки, и так же как и имена инструментов, которые Claude Code удалил, такие как TaskOutput.
Метка, отображаемая для инструмента в стенограмме и диалоге разрешений, может отличаться от его канонического имени. Например, инструмент с меткой Stop Task в стенограмме имеет каноническое имя TaskStop. Правила разрешений и матчеры hook не совпадают с меткой, поэтому правило, написанное как Stop Task, не совпадает. Для правил отказа и запроса предупреждение при запуске выше ловит несоответствие. Используйте канонические имена, указанные в справочнике инструментов.
Правила разрешений для конкретных инструментов
Bash
Правила Bash соответствуют всему тексту команды, где * обозначает любой текст. Шаблоны подстановки показывает, какие команды соответствуют каждой форме правила и где размещать *. Остальная часть этого раздела охватывает то, как Claude Code сопоставляет составные команды и обёртки, что правило не соответствует, команды только для чтения и перенаправления.
Составные команды
Claude Code осведомлён об операторах оболочки, поэтому правило вроде Bash(safe-cmd *) не даст ему разрешение на выполнение команды safe-cmd && other-cmd. Распознаваемые разделители команд — это &&, ||, ;, |, |&, & и новые строки. Правило должно соответствовать каждой подкоманде независимо.
Правила отказа и запроса применяются, когда любая подкоманда им соответствует, включая команду, вложенную в подоболочку, подстановку команды или тело управления потоком, такое как цикл for. Правило запроса вроде Bash(git clean *) по-прежнему запрашивает вас для cd /tmp && git clean -f или echo "$(git clean -f)", даже в автоматическом режиме.
Когда после && или || ничего нет, например в npm test &&, Claude Code рассматривает команду как неразбираемую и не разбивает её на подкоманды для сопоставления правил разрешения, поэтому правило вроде Bash(npm *) не одобряет её.
Когда вы одобряете составную команду с помощью «Да, и больше не спрашивать», Claude Code сохраняет отдельное правило для каждой подкоманды, требующей одобрения, а не одно правило для полной строки составной команды. Например, одобрение git status && npm test сохраняет правило для npm test, поэтому будущие вызовы npm test распознаются независимо от того, что предшествует &&. Подкоманды вроде cd в каталог вне ваших рабочих каталогов генерируют собственное правило Read для этого пути. Для одной составной команды может быть сохранено до 5 правил.
Обёртки
Перед сопоставлением правил Bash, Claude Code удаляет фиксированный набор обёрток, поэтому правило вроде Bash(npm test *) также соответствует timeout 30 npm test. Удаляемые обёртки — это timeout, time, nice, nohup и stdbuf, плюс встроенные команды оболочки command и builtin, а также noglob в zsh. Каждая запускает свой аргумент как фактическую команду. Две связанные формы не удаляются: форма запроса command -v, которая ищет команду, а не запускает её, и nocorrect в zsh.
Claude Code также удаляет начальное присваивание определённых известных безопасных переменных окружения, поэтому Bash(npm test *) соответствует NODE_ENV=test npm test. Правило разрешения не будет соответствовать после присваивания любой другой переменной. Правило отказа или запроса соответствует после любого начального присваивания, поэтому Bash(rm *) в отказе по-прежнему соответствует FOO=bar rm -rf tmp/.
Голый xargs также удаляется, поэтому Bash(grep *) соответствует xargs grep pattern. Удаление применяется только когда xargs не имеет флагов: вызов вроде xargs -n1 grep pattern сопоставляется как команда xargs, поэтому правила, написанные для внутренней команды, его не охватывают.
Этот список обёрток встроен и не настраивается. Средства запуска среды разработки, такие как direnv exec, devbox run, mise exec, npx и docker exec, не входят в список. Поскольку эти инструменты выполняют свои аргументы как команду, правило вроде Bash(devbox run *) соответствует всему, что идёт после run, включая devbox run rm -rf .. Чтобы одобрить работу внутри средства запуска среды, напишите конкретное правило, которое включает как средство запуска, так и внутреннюю команду, например Bash(devbox run npm test). Добавьте одно правило для каждой внутренней команды, которую вы хотите разрешить.
Обёртки exec, такие как watch, setsid, ionice и flock, не могут быть автоматически одобрены правилом префикса вроде Bash(watch *), поэтому в ручном режиме они всегда запрашивают. То же самое применяется к find с -exec или -delete: правило Bash(find *) не охватывает эти формы. Чтобы одобрить конкретный вызов, напишите правило точного совпадения для полной строки команды.
Что правило Bash не соответствует
Правило Bash соответствует тексту команды, который пишет Claude, после того как Claude Code разбивает составные команды и удаляет обёртки. Оно не соответствует одной и той же программе, вызванной в другой форме, поэтому правило отказа или запроса охватывает вызов, который Claude обычно производит, и не является границей безопасности вокруг программы. Эти правила в deny или ask останавливают первую форму, но не другие:
| Правило | Останавливает | Не останавливает |
|---|---|---|
Bash(curl *) |
curl https://example.com |
/usr/bin/curl https://example.com, sh -c 'curl https://example.com' |
Bash(rm *) |
rm -rf build/ |
/bin/rm -rf build/, bash -c 'rm -rf build/' |
Bash(git push *) |
git push origin main |
git -C . push origin main, git -c push.default=current push origin main, git 'push' origin main |
Ваши другие правила и режим разрешений определяют команды в последнем столбце.
Для принудительного применения файловой системы и сети, которое не зависит от текста команды, используйте изоляцию в песочнице. Чтобы проверить полный текст команды с вашей собственной логикой перед её выполнением, используйте hook PreToolUse.
Команды только для чтения
Claude Code распознаёт встроенный набор команд Bash как команды только для чтения и выполняет их без запроса разрешения в каждом режиме, за исключением пути, который permissions.blockReadsOutsideWorkingDirectories ограничивает. Набор включает ls, cat, echo, pwd, head, tail, grep, find, wc, which, diff, stat, du, cd и формы git только для чтения. Набор не настраивается; чтобы требовать запрос для одной из этих команд, добавьте правило ask или deny для неё. В автоматическом режиме эти команды также могут ждать проверки классификатора; см. как классификатор оценивает действия.
Перенаправление вроде ls > out.txt добавляет проверку на цель. См. Перенаправления.
Неэкранированные шаблоны glob разрешены для команд, у которых каждый флаг только для чтения, поэтому ls *.ts и wc -l src/*.py выполняются без запроса.
В ручном режиме команды из этого набора по-прежнему запрашивают в этих случаях:
- Неэкранированные глобы для команд с флагами, способными к записи: команды с флагами, способными к записи или выполнению, такие как
find,sort,sedиgit, запрашивают при наличии неэкранированного глоба, потому что глоб может расширяться до флага вроде-delete. dockerуказывающий на другой демон: формыdockerтолько для чтения запрашивают, когда команда содержит флаг, который выбирает другой демон, такой как-H,--contextили--urlи--connectionв Podman.fileс флагами открытия пути:fileзапрашивает, когда он передаёт-m/--magic-fileили-f/--files-from, потому что эти флаги заставляютfileоткрывать пути, названные в значении флага.- Сетевые пути в Windows: команда, аргументы которой включают сетевой путь (UNC), такой как
\\server\share\file, запрашивает, потому что доступ к сетевому пути может отправить ваши учётные данные Windows хосту, который он называет. Та же проверка применяется к командам инструмента PowerShell. - Команды, которые анализ не может разобрать: когда Claude Code не может полностью разобрать команду, он запрашивает одобрение вместо того, чтобы рассматривать команду как только для чтения. Команды длиннее 10 000 символов всегда запрашивают, потому что они превышают то, что анализ разбирает.
cd в путь внутри вашего рабочего каталога или дополнительного каталога также только для чтения, и составная команда вроде cd packages/api && ls выполняется без запроса, когда каждая часть квалифицируется самостоятельно. Эти комбинации запрашивают даже когда каждая часть только для чтения:
cdсgit: запрашивает, когдаcdпереходит в другой каталог, поскольку запускgitв новом каталоге может выполнить hooks этого каталога.cd, чья цель разрешается в текущий рабочий каталог, является холостым ходом и не вызывает запрос.cdс перенаправлением: запрашивает, когда Claude Code не может определить, в какой каталог разрешается цель перенаправления после выполненияcd. Команда, единственной целью перенаправления которой является/dev/null, такая какcd app; grep -r pattern . 2>/dev/null, не запрашивает, потому что/dev/nullне зависит от рабочего каталога.
Шаблоны разрешений Bash, которые пытаются ограничить аргументы команды, хрупкие. Например, Bash(curl http://github.com/ *) предназначен для ограничения curl URL-адресами GitHub, но не будет соответствовать вариациям вроде:
- Опции перед URL:
curl -X GET http://github.com/... - Другой протокол:
curl https://github.com/... - Перенаправления:
curl -L http://short.example.com/xyz, которое перенаправляет на GitHub - Переменные:
URL=http://github.com && curl $URL
Для более надёжной фильтрации URL рассмотрите:
- Ограничить сетевые инструменты Bash: используйте правила отказа для остановки
curl,wgetи подобных команд, затем используйте инструмент WebFetch с разрешениемWebFetch(domain:github.com)для разрешённых доменов. Правило отказа не соответствует одной и той же программе по пути или внутриsh -c, поэтому объедините его с списком разрешений сети песочницы, когда ограничение должно действовать; см. что правило Bash не соответствует - Используйте hooks PreToolUse: реализуйте hook, который проверяет URL-адреса в командах Bash и блокирует недопустимые домены
- Добавьте руководство CLAUDE.md: опишите ваши разрешённые шаблоны curl в
CLAUDE.md. Это формирует то, что Claude пытается, но не обеспечивает границу, поэтому объедините с одним из вариантов выше
Обратите внимание, что использование только WebFetch не предотвращает сетевой доступ. Если Bash разрешён, Claude по-прежнему может использовать curl, wget или другие инструменты для доступа к любому URL-адресу.
Перенаправления
Когда команда перенаправляет вывод или ввод, Claude Code проверяет цель перенаправления против ваших правил файлов, как если бы Claude напрямую написал или прочитал этот файл:
- Перенаправления вывода: для
> file,>> fileили2> file, проверка охватывает ваши правила разрешения и отказаEdit, защищённые пути и рабочие каталоги. Правило вродеBash(git commit *)разрешает команду, а не цель. Цель, которая начинается с~или содержит символ глоба, требует вашего одобрения. - Перенаправления ввода: для
< file, проверка охватывает ваши правила разрешения и отказаReadи рабочие каталоги. Цель вне рабочих каталогов требует вашего одобрения, если правило разрешения её не охватывает. Цель, которая содержит шаблон глоба или относительный путь, следующий заcdв той же команде, требует вашего одобрения даже когда правило разрешения её охватывает. Claude Code проверяет цели ввода в v2.1.257 и позже.
Цели без файла позади них не проверяются: /dev/null, формы дескриптора файла, такие как 2>&1 и <&3, и here-docs и here-strings.
Claude Code также проверяет файлы, которые пишет команда tee, включая в конвейер вроде make | tee build.log. Проверка охватывает ваши правила разрешения и отказа Edit, защищённые пути и рабочие каталоги. Правило разрешения вроде Bash(tee *) не охватывает пункт назначения вне рабочих каталогов. Claude Code проверяет цели tee в v2.1.269 и позже.
PowerShell
Правила разрешений PowerShell используют ту же форму, что и правила Bash. Подстановки с * соответствуют в любой позиции, суффикс :* эквивалентен конечному *, и голый PowerShell или PowerShell(*) соответствует каждой команде. Эта конфигурация разрешает команды Get-ChildItem и git commit при блокировании Remove-Item:
{
"permissions": {
"allow": [
"PowerShell(Get-ChildItem *)",
"PowerShell(git commit *)"
],
"deny": [
"PowerShell(Remove-Item *)"
]
}
}
Общие псевдонимы канонизируются перед сопоставлением. Правило, написанное для имени cmdlet, также соответствует его псевдонимам, поэтому PowerShell(Get-ChildItem *) соответствует gci, ls и dir также. Сопоставление не чувствительно к регистру.
Claude Code разбирает AST PowerShell и проверяет каждую команду в составной команде независимо. Операторы конвейера |, разделители операторов ; и на PowerShell 7+ операторы цепи && и || разбивают составную команду на подкоманды. Правило должно соответствовать каждой подкоманде, чтобы составная команда была разрешена.
Read и Edit
Чтобы заблокировать инструменты файлов Claude от чтения файла или каталога, добавьте правило отказа Read для его пути, такое как Read(./.env) или Read(./secrets/**) ; Исключить конфиденциальные файлы содержит готовый к вставке пример.
Правила Edit применяются ко всем встроенным инструментам, которые редактируют файлы. Claude прилагает наилучшие усилия для применения правил Read ко всем встроенным инструментам, которые читают файлы, таким как Grep и Glob, к упоминаниям @file в ваших подсказках и к выделению и контексту открытого файла, которые подключённый IDE делит с Claude.
Правило отказа Read также блокирует инструменты Edit и Write на том же пути, включая создание нового файла там. NotebookEdit не охватывается, поэтому добавьте правило отказа Edit для путей, которые ни один инструмент не может изменять. Проверка требует Claude Code v2.1.208 или позже при редактировании, и v2.1.228 или позже при записи.
Claude Code проверяет разрешения файлов только против правил Edit(path) и Read(path). Если вы напишете правило пути для Write, NotebookEdit, Glob или устаревшего инструмента MultiEdit, Claude Code принимает правило, но никогда не консультируется с ним, и предупреждает при запуске, за исключением правила Glob, переданного в --allowedTools. Используйте Edit(docs/**) вместо Write(docs/**), NotebookEdit(docs/**) или MultiEdit(docs/**), и Read(docs/**) вместо Glob(docs/**). Claude Code не предупреждает о правиле имени инструмента без пути, такое как правило отказа для Write; оно соответствует этому правилу на уровне инструмента везде. Требует Claude Code v2.1.210 или позже.
Правила отказа Read и Edit применяются к встроенным инструментам файлов Claude, к командам файлов, которые Claude Code распознаёт в Bash, таким как cat, head, tail, sed и tee, и к целям перенаправления Bash redirections, таким как > file и < file. Они не применяются к команде, которая читает файлы без их именования, такой как grep -r pattern ., запущенная из каталога, который содержит файл, или к произвольным подпроцессам, которые косвенно читают или пишут файлы, вроде скрипта Python или Node, который открывает файлы сам. Для принудительного применения на уровне ОС, которое блокирует все процессы от доступа к пути, включите песочницу.
Правила Read и Edit оба используют синтаксис шаблона gitignore с четырьмя различными типами шаблонов; для шаблонов каталогов с одним сегментом глубина сопоставления также зависит от типа правила, описанного позже в этом разделе:
| Шаблон | Значение | Пример | Соответствует |
|---|---|---|---|
//path |
Абсолютный путь от корня файловой системы | Read(//Users/alice/secrets/**) |
/Users/alice/secrets/** |
~/path |
Путь от домашнего каталога | Read(~/Documents/*.pdf) |
/Users/alice/Documents/*.pdf |
/path |
Путь относительно источника параметров | Edit(/src/**/*.ts) |
<primary working directory>/src/**/*.ts в параметрах проекта |
path или ./path |
Путь относительно текущего каталога | Read(*.env) |
<cwd>/*.env |
Шаблон вроде /Users/alice/file не является абсолютным путём. Одна начальная косая черта якорирует в источнике параметров, а не в корне файловой системы. Используйте //Users/alice/file для абсолютных путей.
Шаблон /path якорирует в каталоге, связанном с источником параметров, который его определяет, поэтому одно и то же правило соответствует разным местоположениям в зависимости от того, где вы его разместите:
| Правило определено в | /path разрешается в |
|---|---|
Параметры проекта в .claude/settings.json |
<primary working directory>/path |
Локальные параметры в .claude/settings.local.json |
<primary working directory>/path |
Параметры пользователя в ~/.claude/settings.json |
~/.claude/path |
Файл, переданный с --settings <file> |
<directory of file>/path |
| Флаги CLI или правила сеанса | <primary working directory>/path |
Правило, которое вы добавляете через /permissions, следует строке для файла параметров, в который вы его сохраняете.
Правила локальных параметров якорируют в основном рабочем каталоге сеанса, а не в корне репозитория, где Claude Code хранит файл в v2.1.211 и позже. В сеансе, запущенном в корне репозитория, два каталога одинаковы; в сеансе worktree, общее правило вроде Edit(/src/**) соответствует собственному каталогу src/ этого worktree.
Правило отказа вроде Read(/secrets/**) в параметрах пользователя блокирует ~/.claude/secrets/**, а не каталог secrets в вашем проекте. Чтобы написать правило в параметрах пользователя, которое применяется внутри каждого проекта, используйте вместо этого абсолютный путь // или путь относительно дома ~/.
В Windows пути нормализуются в форму POSIX перед сопоставлением. C:\Users\alice становится /c/Users/alice, поэтому используйте //c/**/.env для соответствия файлам .env в любом месте на этом диске. Чтобы соответствовать на всех дисках, используйте //**/.env.
Примеры:
Edit(/docs/**): редактирует в<primary working directory>/docs/, а не в/docs/или<primary working directory>/.claude/docs/Read(~/.zshrc): читает.zshrcвашего домашнего каталогаEdit(//tmp/scratch.txt): редактирует абсолютный путь/tmp/scratch.txtRead(src/**): как правило разрешения, читает из<current-directory>/src/только; как правило отказа или запроса, соответствует каталогуsrcна любой глубине под текущим каталогом
Правило соответствует только файлам под его якорем; в этих границах глубина сопоставления зависит от формы шаблона и, для шаблонов каталогов с одним сегментом, типа правила, описанного ниже. Голые имена файлов следуют семантике gitignore и соответствуют на любой глубине, поэтому Read(.env) и Read(**/.env) эквивалентны:
| Правило отказа | Блокирует | Не блокирует |
|---|---|---|
Read(.env) или Read(**/.env) |
любой .env в текущем каталоге или под ним |
.env в родительском каталоге или другом проекте |
Read(//**/.env) |
любой .env в любом месте файловой системы |
ничего; правило якорировано в корне файловой системы |
Относительный шаблон с одним сегментом каталога, такой как src/**, соответствует на разных глубинах в зависимости от типа правила:
- Правила разрешения:
Edit(src/**)соответствует только<cwd>/srcи файлам под ним. Чтобы разрешить имя каталога на любой глубине, напишитеEdit(**/src/**). - Правила отказа и запроса:
Read(secrets/**)соответствует каталогу с именемsecretsна любой глубине под текущим каталогом, поэтому правило также применяется к вложенным копиям.
Каждая другая форма шаблона соответствует на одной и той же глубине в каждом типе правила: Edit(/src/**) и Edit(src/components/**) соответствуют только в их якорированном местоположении, в то время как Edit(**/src/**) соответствует на любой глубине.
Следующий пример показывает каждую форму шаблона против проекта с каталогом src/ верхнего уровня и вложенной копией под vendor/:
<current-directory>/
├── src/
│ └── app.ts
└── vendor/
└── pkg/
└── src/
└── lib.js
| Правило | Соответствует src/app.ts |
Соответствует vendor/pkg/src/lib.js |
|---|---|---|
Edit(src/**) как правило разрешения |
Да | Нет |
Edit(src/**) как правило отказа или запроса |
Да | Да |
Edit(/src/**) в любом типе правила |
Да | Нет |
Edit(**/src/**) в любом типе правила |
Да | Да |
В шаблонах gitignore * соответствует в пределах одного сегмента пути и может появляться в любой позиции в шаблоне, в то время как ** соответствует через каталоги.
Когда вы одобряете путь файла с помощью «Да, и больше не спрашивать», Claude Code экранирует символы шаблона gitignore в этом пути, такие как [, ] и *, поэтому сгенерированное правило соответствует только буквальному пути, который вы одобрили. Правила, которые вы пишете сами, не экранируются. До v2.1.202 Claude Code сохранял путь неэкранированным, поэтому сгенерированное правило для каталога с именем [2024-06] Reports могло не соответствовать собственному пути или соответствовать непредусмотренным соседним каталогам.
Вам не нужно экранировать скобки в пути, поэтому Edit(./Finance (2024)/**) соответствует папке Finance (2024) как написано.
Правило отказа или запроса, чей путь не пригоден для использования в качестве шаблона gitignore, по-прежнему охраняет этот точный путь. Правило разрешения с непригодным шаблоном ничего не одобряет.
Шаблон отказа или запроса, который начинается с !, является отрицанием gitignore. Он вырезает пути, которые он соответствует, из правил path или ./path, перечисленных перед ним. В одном списке deny файла параметров Read(*.env), за которым следует Read(!sample.env), блокирует каждый файл, имя которого заканчивается на .env на любой глубине, за исключением файлов с именем sample.env. Правило !, перечисленное первым, ничего не вырезает.
Вырезание достигает только правил из одного источника. Read(!.env) в параметрах проекта или в --disallowedTools не отменяет отказ Read(./.env) из управляемых параметров или любого другого файла параметров.
Два ограничения сужают то, что может вырезать шаблон !:
- Claude Code читает шаблон
!относительно текущего каталога даже когда после!следует/,~/или//, поэтому шаблон не может достичь правила, якорированного одним из этих префиксов.Read(!~/notes/public/**)ничего не вырезает изRead(~/notes/**). - Вырезание не может переоткрыть файл внутри каталога, который правило блокирует целиком. С
Read(secrets/**)иRead(!secrets/public/**), Claude Code по-прежнему блокируетsecrets/publicвместе с остальной частьюsecrets.
Символические ссылки
Когда путь файла, который запрашивает Claude, проходит через символическую ссылку, проверка разрешения охватывает два пути: запрошенный путь и файл, на который он разрешается. Это применяется к символическим ссылкам на macOS, Linux и Windows, а также к соединениям каталогов на Windows.
Как правила соответствуют символически связанному пути
Правила разрешения и отказа обрабатывают запрошенный путь и файл, на который он разрешается, по-разному:
- Правила разрешения: применяются только когда оба пути символической ссылки и её цель соответствуют. Чтение через символическую ссылку внутри разрешённого каталога, которая указывает вне его, не соответствует правилу.
- Правила отказа: применяются когда либо путь символической ссылки, либо её цель соответствует. Символическая ссылка, которая указывает на запрещённый файл, сама запрещена. Например, с
Read(./project/**)разрешённым иRead(~/.ssh/**)запрещённым, символическая ссылка в./project/key, указывающая на~/.ssh/id_rsa, блокируется: цель не проходит правило разрешения и соответствует правилу отказа.
На macOS и Linux, правило отказа или запроса, написанное через символически связанный каталог с шаблоном //, ~/ или /, также применяется в реальном местоположении каталога. Например, на macOS, где /etc разрешается в /private/etc, Read(//etc/**) также блокирует /private/etc/hosts. До v2.1.268 правило отказа или запроса, написанное через символически связанный каталог, не применялось к пути, заданному его реальным местоположением.
Grep и Glob ищут каталог, на который разрешается аргумент path. Claude Code применяет правила отказа Read к этому каталогу.
Записи через символическую ссылку
Если путь, который Claude просит отредактировать или написать, сам является символической ссылкой, инструменты Edit и Write отказывают в записи и направляют Claude к цели ссылки.
Запись по-прежнему может пройти через символическую ссылку, когда каталог на пути к файлу является символической ссылкой, или когда команда Bash или PowerShell выполняет запись. Для этих записей то, что происходит, зависит от того, где файл, на который разрешается запись, находится относительно ваших рабочих каталогов и защищённых путей:
- Разрешается вне рабочих каталогов: когда запрошенный путь находится внутри ваших рабочих каталогов, а файл, на который он разрешается, нет, запись не автоматически одобряется в режиме
acceptEdits. В автоматическом режиме, если правило разрешения не одобряет запись, вас запрашивают вместо того, чтобы классификатор решал. Запрос называет путь, на который разрешается запись. - Разрешается к защищённому пути, который запрошенный путь не называет: таблица защищённых путей даёт результат для каждого режима разрешений, за исключением того, что где таблица маршрутизирует запись к классификатору, эта запись вместо этого запрашивает вас.
Пути, которые не могут быть разрешены или которые изменяются
Когда Claude Code не может определить, где путь ведёт на диск, например потому что символические ссылки на нём образуют цикл, инструменты Read, Edit и Write отказывают в операции.
Когда инструмент затем открывает одобренный файл, он подтверждает, что путь по-прежнему разрешается в местоположение, которое проверка разрешения одобрила.
WebFetch
Правила WebFetch используют префикс domain: и соответствуют имени хоста запрашиваемого URL. Сопоставление не чувствительно к регистру, поддерживает подстановки * и удаляет конечную . из правила и имени хоста, поэтому example.com. и example.com рассматриваются одинаково.
WebFetch(domain:example.com)соответствует запросам кexample.comWebFetch(domain:*.example.com)соответствует любому поддомену на любой глубине, такому какapi.example.comилиa.b.example.com, но не самомуexample.comWebFetch(domain:*)соответствует каждому домену. Это не то же самое, что голое правилоWebFetch; см. Разрешить или запретить каждую выборку
В любой позиции, отличной от начального *. или голого *, подстановка соответствует только тексту между двумя точками. WebFetch(domain:example.*) соответствует example.org, где * становится org, но не example.evil.com, где * пришлось бы стать evil.com и пересечь точку. Это предотвращает конечную подстановку от соответствия доменам, которые злоумышленник мог бы зарегистрировать.
Подстановки в правилах WebFetch требуют Claude Code v2.1.172 или позже для соответствия выборкам.
Разрешить или запретить каждую выборку
Голое правило WebFetch — это имя инструмента без части domain:, такое как "deny": ["WebFetch"]. Оно и WebFetch(domain:*) охватывают каждый URL, но Claude Code применяет их по-разному, и только форма domain: также добавляет свой домен в список разрешённых или запрещённых доменов песочницы. Этот раздел перечисляет формы подстановки, которые песочница соблюдает, и версию, которая добавила голый *.
Каждая строка показывает, что правило делает в списке allow и в списке deny:
| Правило | В allow |
В deny |
|---|---|---|
WebFetch |
Claude выполняет выборку без запроса вас. Не изменяет, какие хосты могут достичь изолированные команды. | Claude Code удаляет инструмент WebFetch, поэтому Claude вообще не может выполнять выборку. Не изменяет, какие хосты могут достичь изолированные команды. |
WebFetch(domain:*) |
Claude выполняет выборку без запроса вас, и изолированные команды могут достичь любого хоста. | Claude Code сохраняет инструмент и отказывает каждой выборке, и изолированные команды не могут достичь ни один хост. |
Две формы также отличаются при чтении артефактов, страниц, которые инструмент Artifact публикует на claude.ai. Голое правило отказа или запроса WebFetch не применяется к этим чтениям. Правило domain:, охватывающее claude.ai или хост содержимого *.claudeusercontent.com, такое как WebFetch(domain:claude.ai) или WebFetch(domain:*), отказывает каждому чтению или запрашивает перед ним. Правило Artifact делает то же самое.
Когда правило блокирует чтение, отказ называет правило. До v2.1.268 голое правило отказа WebFetch блокировало каждое чтение артефакта, и голое правило запроса запрашивало перед каждым.
Чтобы позволить Claude выполнять выборку свободно, сохраняя список разрешений песочницы как есть, используйте голую форму. Этот settings.json делает это:
{
"permissions": {
"allow": ["WebFetch"]
}
}
Когда вы просите Claude выполнить выборку страницы, он выполняет её без запроса. Когда вы просите его запустить изолированный curl против хоста вне списка разрешений песочницы, Claude Code по-прежнему запрашивает вас для этого хоста, потому что голое правило не добавило хост в список разрешений.
В автоматическом режиме, Claude вместо этого называет хост в разрешённых доменах для каждой команды команды для проверки классификатором.
MCP
Правила MCP используют имя сервера в соответствии с конфигурацией Claude Code, опционально за которым следует имя инструмента с этого сервера.
mcp__puppeteerсоответствует любому инструменту, предоставленному серверомpuppeteermcp__puppeteer__*использует синтаксис подстановки и также соответствует всем инструментам с сервераpuppeteermcp__puppeteer__puppeteer_navigateсоответствует инструментуpuppeteer_navigate, предоставленному серверомpuppeteer
Если ваша организация установила инструмент коннектора claude.ai на ask и эта настройка достигает Claude Code в вашем сеансе, правила разрешения для этого инструмента не вступают в силу: Claude Code запрашивает при каждом вызове, даже в режимах auto и bypassPermissions. В режиме dontAsk, который никогда не запрашивает, Claude Code вместо этого отказывает вызову. Инструменты из коннекторов, которые Claude Code выбирает сам, появляются как mcp__claude_ai_<server>__<tool>.
В сеансе Cowork в приложении Claude Desktop, Claude запускает команды оболочки через инструмент mcp__workspace__bash Cowork вместо встроенного инструмента Bash, и Cowork также предоставляет mcp__workspace__web_fetch для выборок в сети. Claude Code также применяет правила отказа, которые называют весь инструмент Bash или WebFetch, к этим инструментам Cowork, поэтому управляемое правило отказа Bash останавливает Claude от запуска команд оболочки в Cowork. Когда Claude Code блокирует такой вызов, сообщение называет инструмент Cowork: Permission to use mcp__workspace__bash has been denied. Правила разрешения не переносятся: Claude Code никогда не применяет правило разрешения Bash к mcp__workspace__bash.
Agent (подагенты)
Используйте правила Agent(AgentName) для управления тем, какие подагенты может использовать Claude:
Agent(Explore)соответствует подагенту ExploreAgent(Plan)соответствует подагенту PlanAgent(my-custom-agent)соответствует пользовательскому подагенту с именемmy-custom-agent
Добавьте эти правила в массив deny в ваших параметрах или используйте флаг CLI --disallowedTools для отключения конкретных агентов. Чтобы отключить агент Explore:
{
"permissions": {
"deny": ["Agent(Explore)"]
}
}
Cd
Правила Cd управляют тем, в какие каталоги команда /cd может переместить сеанс. Cd не является инструментом, вызываемым моделью: Claude не может его вызвать, и правила применяются только когда вы сами запускаете /cd.
Голое правило отказа Cd полностью отключает /cd. Правило отказа Cd(<path-pattern>) блокирует соответствующие цели. Правила отказа проверяют каждое написание цели, включая каждый скачок символической ссылки, через который она разрешается, поэтому правило, написанное для одного пути, также блокирует цели, которые разрешаются в него.
Добавление любого правила разрешения Cd переключает /cd в режим списка разрешений: разрешённый целевой каталог должен соответствовать одному из ваших правил разрешения, или /cd отказывает. Без настроенных правил Cd, /cd сохраняет своё поведение по умолчанию и запрашивает вас доверять незнакомому каталогу.
Шаблоны путей используют якоря //, ~/ и / из правил Read и Edit, но сопоставление якорировано к целому пути каталога, а не в стиле gitignore. * соответствует ровно одному сегменту пути и ** соответствует через сегменты. Конечный /** также соответствует его названному корню.
| Правило | Соответствует | Не соответствует |
|---|---|---|
Cd(~/code/*) |
~/code/app |
~/code/app/src, ~/code |
Cd(~/code/**) |
~/code и любой каталог под ним |
каталоги вне ~/code |
Cd(**/node_modules) |
любой каталог node_modules на любой глубине под текущим каталогом |
node_modules/pkg |
Расширение разрешений с помощью hooks
Claude Code hooks позволяют регистрировать пользовательские команды оболочки, которые оценивают разрешения во время выполнения. Когда Claude Code выполняет вызов инструмента, PreToolUse hooks запускаются перед запросом разрешения для каждого инструмента, кроме EndConversation. Выход hook может отклонить вызов инструмента, принудить запрос или пропустить запрос, чтобы позволить вызову продолжиться.
Решения hook не обходят правила разрешений. Claude Code оценивает правила deny и ask независимо от того, что возвращает PreToolUse hook: совпадающее правило deny блокирует вызов, и совпадающее правило ask по-прежнему запрашивает даже когда hook вернул "allow" или "ask". Это сохраняет приоритет deny-first, описанный в Управление разрешениями, включая правила deny, установленные в управляемых параметрах.
Инструменты MCP, отмеченные requiresUserInteraction, также по-прежнему запрашивают, когда hook возвращает "allow", как и инструменты соединителя установленные вашей организацией на ask в сеансах, где эта настройка достигает Claude Code.
Блокирующий hook также имеет приоритет над правилами allow. Hook, который выходит с кодом 2, останавливает вызов инструмента перед оценкой правил разрешений, поэтому блокировка применяется даже когда правило allow иначе позволило бы вызову продолжиться. Чтобы запустить все Bash команды без запросов, кроме нескольких, которые вы хотите заблокировать, добавьте "Bash" в список allow и зарегистрируйте PreToolUse hook, который отклоняет эти конкретные команды. См. Блокировка редактирования защищённых файлов для скрипта hook, который вы можете адаптировать.
Рабочие каталоги
По умолчанию Claude имеет доступ к файлам в каталоге, где вы его запустили. Этот каталог является основным рабочим каталогом сеанса до тех пор, пока вы не переместите сеанс с помощью /cd. Вы можете расширить этот доступ:
- При запуске: используйте аргумент CLI
--add-dir <path> - Во время сеанса: используйте команду
/add-dir - Постоянная конфигурация: добавьте в
additionalDirectoriesв файлы параметров
Файлы в дополнительных каталогах следуют тем же правилам разрешений, что и исходный рабочий каталог: они становятся читаемыми без запросов, и разрешения на редактирование файлов следуют текущему режиму разрешений.
Вы не можете добавить большинство сетевых путей, таких как общая папка UNC \\server\share, в качестве рабочих каталогов, потому что поиск может связаться с хостом, который она называет. На Windows вместо этого сопоставьте общую папку с буквой диска и передайте диск с помощью --add-dir при запуске.
Установите permissions.blockReadsOutsideWorkingDirectories, чтобы инструменты работы с файлами отказывали в путях, которые она ограничивает, в каждом режиме разрешений. В автоматическом режиме Claude Code предлагает включить это в первый раз, когда Claude читает вне рабочих каталогов.
В фоновых сеансах на macOS хост сеанса запрашивает доступ к защищённым папкам, таким как ~/Desktop, ~/Documents и ~/Downloads, отдельно от вашего терминала, когда Claude нужно читать или писать файлы там; если чтение там завершается с ошибкой Operation not permitted, см. как предоставить доступ к папкам для фоновых сеансов.
Переместить сеанс в другой каталог
Чтобы переместить сеанс в другой основной рабочий каталог, вместо добавления каталога рядом с текущим, запустите /cd <path>. Claude Code сохраняет беседу, загружает CLAUDE.md нового каталога и предлагает вам доверить рабочему пространству, если вы в нём раньше не работали. После этого Claude Code находит перемещённый сеанс, когда вы запускаете --resume из нового каталога.
Как только вы переместитесь, Claude Code применяет конфигурацию проекта нового каталога:
- Его параметры проекта, включая их правила разрешений и hooks
- Его серверы
.mcp.json, подлежащие тому же одобрению сервера, что и при запуске, и локальные MCP серверы, которые вы зарегистрировали в нём - Плагины, которые его параметры включают, его skills и его subagents
- Его значения
env, применённые поверх переменных окружения из параметров предыдущего каталога, которые остаются в силе
Claude Code также отключает проект предыдущего каталога и локальные MCP серверы, а также серверы плагинов, которые больше не включены после перемещения. Он берёт дополнительные каталоги из параметров нового каталога вместо параметров предыдущего и сохраняет каталоги, которые вы добавили с помощью --add-dir или /add-dir. Hooks, которые активирует перемещение, по-прежнему получают ${CLAUDE_PROJECT_DIR}, установленный в корень проекта, где сеанс начался.
Когда новый каталог ещё не доверен, Claude Code перечисляет в подсказке доверия правила разрешения, дополнительные каталоги, hooks и вспомогательные команды, которые активировали бы параметры каталога, чтобы вы могли их просмотреть перед принятием. Если вы отклоните, сеанс останется там, где он был. До версии 2.1.246 /cd не применял параметры нового каталога, hooks, MCP серверы или skills до тех пор, пока вы не возобновили сеанс, и его подсказка доверия не перечисляла, что активировали бы параметры каталога.
Ограничьте или отключите цели /cd с помощью правил разрешений Cd.
Дополнительные каталоги предоставляют доступ к файлам, а не конфигурацию
Добавление каталога расширяет, где Claude может читать и редактировать файлы. Это не делает этот каталог полным корнем конфигурации: большинство конфигурации .claude/ не обнаруживается из дополнительных каталогов, хотя несколько типов загружаются как исключения.
Эти исключения применяются только к каталогам, добавленным с флагом --add-dir или командой /add-dir, включая каталоги, которые Agent SDK добавляет через флаг. Каталоги, указанные в permissions.additionalDirectories в файле параметров, предоставляют доступ только к файлам и не загружают никакую конфигурацию ниже.
Agent SDK additionalDirectories опция в TypeScript и add_dirs опция в Python получают исключения тоже, хотя опция TypeScript делит своё имя с ключом параметров. SDK передаёт каждую запись в Claude Code как --add-dir, поэтому эти каталоги ведут себя как каталоги, добавленные флагом. Skills, команды и subagents из любого каталога, добавленного флагом, загружаются через источник параметра project setting source, поэтому они не загружаются, когда вы исключаете этот источник с помощью --setting-sources в CLI или settingSources в SDK, и bare mode пропускает команды и subagents среди них.
Следующие типы конфигурации загружаются из каталогов --add-dir:
| Конфигурация | Загружается из --add-dir |
|---|---|
Skills в .claude/skills/ |
Да, с live reload |
Файлы команд в .claude/commands/ |
Да, без live reload. Когда добавленный каталог и ваш проект оба определяют команду с одинаковым именем, Claude Code запускает команду вашего проекта |
Subagents в .claude/agents/ |
Да, без live reload |
Settings в .claude/settings.json и .claude/settings.local.json |
Только ключи enabledPlugins и extraKnownMarketplaces |
CLAUDE.md файлы, .claude/rules/ и CLAUDE.local.md |
Только когда установлено CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1. CLAUDE.local.md дополнительно требует источник параметра local, который включен по умолчанию |
Чтобы загрузить skills, команды и subagents из подкаталога вашего основного рабочего каталога в середине сеанса, запустите /add-dir с путём этого подкаталога. Claude Code загружает их на оставшуюся часть сеанса без запроса или добавления рабочего каталога, потому что подкаталог уже читаем. Это требует Claude Code версии 2.1.257 или позже.
Claude Code обнаруживает стили вывода из текущего рабочего каталога и его родителей, вашего пользовательского каталога в ~/.claude/ и управляемых параметров. Hooks и другие ключи .claude/settings.json загружаются из папки .claude/ текущего рабочего каталога без резервного варианта для родительского каталога, наряду с вашим пользовательским файлом ~/.claude/settings.json и управляемыми параметрами. .claude/settings.local.json загружается из корня репозитория git вместо этого, даже когда вы запускаете Claude Code в подкаталоге, кроме случаев, когда Claude Code не использует корень репозитория, например на Windows; до версии 2.1.211 он тоже загружался только из текущего рабочего каталога. Сеансы Agent SDK загружают его из рабочего каталога во всех версиях.
Чтобы поделиться этой конфигурацией между проектами, используйте один из этих подходов:
- Конфигурация на уровне пользователя: поместите файлы в
~/.claude/agents/,~/.claude/output-styles/или~/.claude/settings.json, чтобы сделать их доступными в каждом проекте - Плагины: упакуйте и распространяйте конфигурацию как плагин, который команды могут установить
- Запуск из каталога конфигурации: запустите Claude Code из каталога, содержащего конфигурацию
.claude/, которую вы хотите использовать
Как разрешения взаимодействуют с песочницей
Разрешения и песочница — это дополняющие друг друга уровни безопасности:
- Разрешения контролируют, какие инструменты может использовать Claude Code и к каким файлам или доменам он может получить доступ. Они применяются к Bash, Read, Edit, WebFetch, MCP и всем остальным инструментам, за исключением того, что правило отказа или запроса не может заблокировать
EndConversation, пока остаётся любой другой инструмент. - Песочница обеспечивает принудительное применение на уровне ОС, которое ограничивает доступ инструмента Bash к файловой системе и сети. Она применяется только к командам Bash, PowerShell и Monitor и их дочерним процессам.
Используйте оба уровня для защиты в глубину, поскольку ограничения песочницы остаются в силе даже если инъекция в подсказку обойдёт принятие решений Claude. Пути и домены из параметров песочницы и правил разрешений объединяются в финальную конфигурацию песочницы.
Когда вы включаете песочницу и оставляете autoAllowBashIfSandboxed со значением по умолчанию true, команды Bash в песочнице выполняются без запроса даже если ваши разрешения включают простое правило запроса Bash, или эквивалентную форму Bash(*): граница песочницы заменяет этот запрос для всего инструмента.
В режиме плана Claude Code пропускает эту замену. Без правила запроса встроенные команды только для чтения по-прежнему выполняются без запроса, и любая другая команда оболочки проходит через обычный поток разрешений пока вы всё ещё планируете; см. режим плана для того, как Claude Code управляет командами там. С простым правилом запроса Bash, каждая команда Bash запрашивается, включая команды только для чтения в песочнице, так же как вне песочницы. До версии v2.1.212 замена применялась также в режиме плана.
Эти проверки по-прежнему применяются:
- Правила запроса с областью действия контента, такие как
Bash(git push *), по-прежнему требуют запроса - Явные правила отказа по-прежнему применяются
- Команды
rmилиrmdir, которые нацелены на критический путь, по-прежнему проходят через обычный поток разрешений
Команды, которые не будут выполняться в песочнице, такие как исключённые команды, соблюдают простое правило запроса Bash как обычно. См. режимы песочницы для изменения этого поведения.
Управляемые параметры
Для организаций, которым требуется централизованный контроль, администраторы развертывают управляемые параметры, которые не могут быть переопределены параметрами пользователя и проекта, за исключением нескольких ключей, чувствительных к безопасности. Развертывание управляемых параметров охватывает механизмы доставки, приоритет в управляемом уровне и ключи, которые могут устанавливать только управляемые параметры.
Один из этих ключей, allowManagedPermissionRulesOnly, делает управляемые параметры единственным источником параметров для правил разрешений. Его запись содержит список каждого источника, который Claude Code затем игнорирует.
disableBypassPermissionsMode обычно размещается в управляемых параметрах для обеспечения организационной политики, но работает из любой области. Пользователь может установить его в своих собственных параметрах, чтобы заблокировать себя из режима bypass.
Приоритет параметров
Правила разрешений следуют тому же приоритету параметров, что и все остальные параметры Claude Code, с управляемыми параметрами на самом высоком уровне: никакой другой уровень, включая аргументы командной строки, не может переопределить управляемое правило разрешения.
Если инструмент запрещен на любом уровне, никакой другой уровень не может его разрешить. Например, управляемый параметр deny не может быть переопределен --allowedTools, и --disallowedTools может добавить ограничения сверх того, что определяют управляемые параметры.
То же самое применяется и к областям параметров: если параметры пользователя разрешают разрешение, а параметры проекта его запрещают, правило запрета блокирует его. Обратное также верно: запрет на уровне пользователя блокирует разрешение на уровне проекта, потому что правила запрета из любой области оцениваются перед правилами разрешения.
Хосты встраивания могут предоставлять дополнительную управляемую политику через опцию SDK managedSettings, включая правила разрешения разрешений, если администратор не устанавливает блокировки allowManaged*Only; раздел Deliver policy to Claude Desktop sessions описывает, когда политика встраивающей стороны применяется вообще.
Правила разрешений проекта и доверие рабочей области
Правила permissions.allow и записи permissions.additionalDirectories в файле .claude/settings.json проекта предоставляют возможности, поэтому Claude Code применяет их только после того, как вы примете диалог доверия рабочей области для этой папки. Диалог перечисляет правила и каталоги, которые папка предоставит, чтобы вы могли их проверить перед принятием. Правила deny и ask не затрагиваются, так как они только ограничивают.
Claude Code сохраняет доверие, которое вы принимаете, в зависимости от того, где вы его запустили:
- В репозитории Claude Code привязывает доверие к корню репозитория git, поэтому доверие охватывает весь репозиторий, кроме любого репозитория git, вложенного в него, например подмодуля. В worktree он использует корень основного checkout, как он это делает для сохранённых правил.
- Вне репозитория Claude Code привязывает доверие к каталогу, из которого вы его запустили, и доверие охватывает любой подкаталог этого каталога, кроме репозитория git, вложенного в него, например клона. Каждый охватываемый подкаталог затем считается папкой, родителю которой вы доверяли.
- Когда вы начинаете работу в домашнем каталоге, Claude Code сохраняет доверие только для текущего сеанса и не записывает его на диск; см. примечание дополнительные меры безопасности.
Claude Code показывает диалог доверия только в интерактивных сеансах. Запуск claude -p или сеанс SDK никогда не показывает его, и доверие к родительской папке не учитывается для этих правил, поэтому Что выполняется до того, как вы доверяете папке указывает, какое содержимое репозитория Claude Code всё ещё использует в каждой из этих двух ситуаций.
Перед запуском или перезапуском фонового сеанса Claude Code также проверяет доверие рабочей области для каталога, в котором выполняется сеанс. Если вы запустите claude --bg из терминала в каталоге, которому вы не доверяли, диалог доверия появляется в первую очередь, и сеанс начинается после того, как вы его примете. Где диалог не может появиться, например в скрипте, команда вместо этого завершается с ошибкой Workspace not trusted.
Когда ваш локальный файл параметров требует доверия
.claude/settings.local.json обычно является вашим собственным файлом, поэтому Claude Code применяет его правила разрешений и дополнительные каталоги без этапа доверия. Когда файл отслеживается в git или .claude является символической ссылкой, Claude Code рассматривает его как предоставленный репозиторием и сохраняет его правила до тех пор, пока вы не доверяете папке.
Claude Code запускает git, чтобы различить эти два случая, и запускает git только после того, как вы доверяли папке: вы приняли диалог доверия для неё или для родительского каталога, доверие которого распространяется на неё, или вы находитесь в сеансе -p или SDK, который считается принятым. До этого момента то, где вы запустили Claude Code, определяет, что происходит с правилами файла:
- В вашем конфигурационном домашнем каталоге: Claude Code применяет
.claude/settings.local.jsonэтой папки сразу же без запуска git. Ваш конфигурационный домашний каталог — это ваш домашний каталог или каталог, чей подкаталог.claudeвы установили какCLAUDE_CONFIG_DIR. Если этот каталогCLAUDE_CONFIG_DIRнаходится внутри репозитория git и Claude Code сохраняет ваши локальные параметры в корне репозитория, он сохраняет правила, как везде. - Везде в другом месте: Claude Code сохраняет правила файла, как параметры проекта. После выполнения проверки Claude Code применяет правила неотслеживаемого файла или файла в каталоге вне любого репозитория git, даже если вы не доверяли этой точной папке.
Исключение конфигурационного домашнего каталога пропускает только этап доверия. ~/.claude/settings.local.json по-прежнему имеет локальную область, поэтому Claude Code читает его только в сеансах, которые вы запускаете в самом вашем домашнем каталоге, а не в каждом проекте. Чтобы применить правила разрешений ко всем вашим проектам, добавьте их в ваши пользовательские параметры вместо этого: ~/.claude/settings.json или $CLAUDE_CONFIG_DIR/settings.json, когда установлен CLAUDE_CONFIG_DIR.
В версиях 2.1.196–2.1.199 Claude Code сохранял правила файла в вашем конфигурационном домашнем каталоге и вне репозиториев git, и выводил предупреждение this workspace has not been trusted там. До версии 2.1.207 Claude Code применял правила неотслеживаемого файла до того, как вы приняли диалог.
Что выполняется до того, как вы доверяете папке
Каждая строка — это один вид содержимого, который может предоставить репозиторий. Столбцы — это две ситуации, в которых вы не доверяли самой папке: вы доверяли только родительской папке или запустили claude -p или SDK там, что никогда не показывает диалог доверия. Столбец родительской папки не применяется внутри вложенного репозитория: в интерактивном сеансе Claude Code показывает диалог доверия для него, и запуск claude -p или SDK там следует столбцу claude -p.
| Что предоставляет репозиторий | Вы доверяли только родительской папке | claude -p или SDK, папка никогда не была доверена |
|---|---|---|
Hooks в файлах параметров, блок env и вспомогательные команды, такие как apiKeyHelper, и hooks проектного skill и allowed-tools |
Используется | Используется. Доверие рабочей области никогда не блокирует allowed-tools skill в любом сеансе |
Правила permissions.allow и additionalDirectories в .claude/settings.json |
Не используется до тех пор, пока вы не примете диалог доверия, который появляется снова, перечисляя их | Не используется. Claude Code выводит предупреждение this workspace has not been trusted в stderr |
Hooks frontmatter в проектном subagent, проектном плагине @skills-dir и записях extraKnownMarketplaces из репозитория или каталога --add-dir |
Не используется, и диалог не предлагается | Не используется |
Встроенные mcpServers в frontmatter subagent из репозитория или каталога --add-dir. До версии 2.1.238 Claude Code загружал эти серверы в обоих ситуациях |
Не используется, и диалог не предлагается | Не используется |
Серверы в .mcp.json, включая те, которые репозиторий одобряет в своих собственных параметрах |
Claude Code спрашивает вас перед подключением. Собственные одобрения репозитория не учитываются | Подключены без запроса, одобрены или нет. SDK загружает их только когда settingSources включает параметры проекта. claude mcp list в той же папке по-прежнему сообщает о таком сервере как ожидающем |
headersHelper на сервере в .mcp.json. До версии 2.1.238 Claude Code запускал помощника в обоих ситуациях |
Не запускается до тех пор, пока вы не примете диалог доверия, который появляется снова, указывая, где объявлен помощник. Claude Code подключает сервер только с его статическими headers до этого момента |
Не запускается. Claude Code подключает сервер с его статическими headers и выводит строку headersHelper not run на сервер в stderr |
Для строк, которым требуется доверие этой точной папки, доверьте ей вручную: установите projects["<path>"].hasTrustDialogAccepted на true в ~/.claude.json, где <path> — это корень репозитория или сама папка вне репозитория. Claude Code выводит точный ключ в строку журнала отладки для пропущенного hook subagent или встроенного MCP сервера, в предупреждение stderr для пропущенных правил разрешений и в строку headersHelper not run для пропущенного помощника.
Перед запуском claude -p в репозитории, который вы не написали, решите, что он может запустить на вашей машине:
- Передайте
--setting-sources userили установитеsettingSourcesSDK без параметров проекта, чтобы Claude Code не читал ни файлы параметров проекта, ни его.mcp.json - Начните с
--bare, чтобы Claude Code не читал hooks, skills, пользовательские команды, subagents, плагины или серверы.mcp.jsonиз проекта. Блокenvпроекта и помощники, такие какawsAuthRefreshв его файлах параметров, по-прежнему применяются, и Claude Code читаетapiKeyHelperтолько из--settings - Передайте
--settings '{"disableAllHooks": true}', чтобы отключить hooks для этого запуска. Установка его только в ваших пользовательских параметрах недостаточна, потому что параметры проекта репозитория имеют приоритет над вашими и могут установить его обратно наfalse - Добавьте запись
disabledMcpjsonServers, чтобы отклонить сервер.mcp.jsonпо имени в каждом типе сеанса
Примеры конфигураций
Этот репозиторий включает начальные конфигурации параметров для распространенных сценариев развертывания. Используйте их как отправные точки и настройте их в соответствии с вашими потребностями.
См. также
- Все параметры: каждый ключ параметра, включая ключи разрешений
- Настройка режима auto: укажите классификатору режима auto, какую инфраструктуру ваша организация доверяет
- Sandboxing: изоляция файловой системы и сети на уровне ОС для команд Bash
- Authentication: настройка доступа пользователей к Claude Code
- Security: гарантии безопасности и лучшие практики
- Hooks: автоматизация рабочих процессов и расширение оценки разрешений