티스토리 뷰
Claude Code Permission이 작동하지 않는 이유: :* vs * 패턴 문제
TL;DR
Claude Code의 .claude/settings.local.json에서 Bash 허용 규칙을 Bash(docker run:*)으로 설정했는데도 매번 permission 팝업이 뜬다면, :* 형식이 deprecated되었기 때문일 수 있다. Bash(docker run *)(공백 + 별표)으로 바꾸면 해결된다.
문제 상황
Claude Code로 Docker 기반 C++ 프로젝트를 개발하면서, docker run 명령이 매우 빈번하게 실행된다. 매번 permission 팝업이 뜨면 워크플로우가 끊기므로, "Allow always"를 눌러서 자동 허용 규칙을 추가해놨다.
그런데 규칙을 추가했는데도 계속 물어본다.
Bash command
docker run --rm -v "$(pwd)":/app video-bench-dev bash -c "cd /app/build && cmake .. && make -j4" 2>&1
Rebuild with all_claimed optimization
Do you want to proceed?
❯ 1. Yes
2. No원인 분석
설정 파일 확인
.claude/settings.local.json을 열어보면 이런 규칙들이 있었다:
{
"permissions": {
"allow": [
"Bash(docker build:*)",
"Bash(docker run:*)",
"Bash(docker stop:*)",
"Bash(docker:*)",
"Bash(git stash push:*)",
"Bash(git add:*)"
]
}
}
Bash(docker run:*), 심지어 Bash(docker:*)까지 있는데 왜 매칭이 안 되는 걸까?
핵심: :* 패턴은 deprecated
Claude Code의 Bash permission 패턴 매칭 형식이 변경되었다:
| 형식 | 상태 | 예시 |
|---|---|---|
Bash(docker run:*) |
Deprecated - 매칭 안 될 수 있음 | : 뒤에 * |
Bash(docker run *) |
현재 정상 형식 | 공백 뒤에 * |
공백 + * 형식은 word boundary를 적용한다. 예를 들어:
Bash(ls *)-ls -la매칭 O,lsof매칭 X (공백이 경계 역할)Bash(ls*)-ls -la매칭 O,lsof도 매칭 O (경계 없음)
"Allow always"가 deprecated 형식으로 저장하는 문제
흥미롭게도, 이 :* 규칙들은 직접 작성한 게 아니다. Claude Code에서 permission 팝업이 뜰 때 "Allow always" 버튼을 누르면 자동 생성되는 규칙이다. 즉, Claude Code 자체가 deprecated 형식으로 규칙을 저장하고 있었다.
해결 방법
1. 패턴 형식 수정
.claude/settings.local.json에서 모든 :*를 *(공백+별표)로 변경한다:
// Before (deprecated)
"Bash(docker run:*)"
// After (correct)
"Bash(docker run *)"
2. 중복 규칙 통합
개별 하위 명령어를 일일이 나열하는 대신, 상위 명령어 하나로 통합할 수 있다:
// Before - 6개 규칙
"Bash(docker build:*)",
"Bash(docker run:*)",
"Bash(docker stop:*)",
"Bash(docker rm:*)",
"Bash(docker ps:*)",
"Bash(docker images:*)"
// After - 1개 규칙
"Bash(docker *)"
3. 정리된 최종 설정
{
"permissions": {
"allow": [
"Bash(docker *)",
"Bash(git *)",
"Bash(gh *)",
"Bash(npm *)",
"Bash(ffprobe *)",
"Bash(ffmpeg *)",
"Bash(ls *)",
"Bash(find *)",
"Bash(tree *)",
"Bash(wc *)",
"Bash(chmod *)",
"Bash(brew *)",
"WebSearch"
]
}
}
4. 적용
설정 변경 후 새 대화를 시작해야 적용된다. /clear 또는 새 터미널 세션을 열면 된다.
교훈
- "Allow always"를 눌렀는데도 계속 물어보면 패턴 형식을 의심하라
.claude/settings.local.json을 주기적으로 확인하고 정리하라 - 자동 생성되는 규칙이 쌓이면서 deprecated 형식이 섞일 수 있다- 규칙은 가능한 상위 레벨로 통합하라 -
docker build *,docker run *,docker stop *을 각각 쓰는 것보다docker *하나가 관리하기 편하다 - 보안과 편의 사이의 균형을 고려하라 -
Bash(docker *)는 편하지만 모든 docker 명령을 허용한다. 프로젝트 특성에 맞게 범위를 조절하면 된다
환경 정보
- Claude Code (CLI)
- 2026년 2월 기준
- macOS / Docker 기반 C++ 프로젝트
'기타' 카테고리의 다른 글
| Linux 서버 CPU 부하 테스트 가이드 (stress-ng) (0) | 2026.02.12 |
|---|---|
| Claude Code GitHub MCP 필요한가? (0) | 2026.02.10 |
| 클로드코드 잘 쓰기 - 책 사기전에 이거부터 읽어보자 (0) | 2026.02.09 |
| Codex 실행시 SyntaxError: Unexpected reserved word 에러 (0) | 2026.02.09 |
| Cursor, Claude Code, Codex 모두 이용중 (0) | 2026.02.08 |
- Total
- Today
- Yesterday
- FairMOT
- 백트래킹
- C++ Deploy
- LCA
- cosine
- 백준 1766
- 순열
- 파이참
- 백준 11437
- 가장 긴 증가하는 부분 수열
- 단축키
- 문제집
- ㅂ
- 위상 정렬 알고리즘
- 백준
- Lowest Common Ancestor
- PyCharm
- 조합
- 인공지능을 위한 선형대수
- 백준 11053
- MOT
- 이분탐색
- 자료구조
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |

