Claude Code 위험한 명령 차단: 실행 전에 막는 안전 모드
rm -rf /, main 브랜치 강제 푸시, DROP TABLE, curl | sh 같은 파괴적인 Bash 명령을 실행 전에 거부합니다.
권한
- 도구 호출 가로채기Claude가 하는 모든 도구 호출을 볼 수 있고(tool.call / tool.check), 이를 차단하거나 변경할 수 있습니다.
- UI 변경Claude Code 화면에 밴드, 패널, 상태 텍스트, 토스트를 그립니다(ui.render / $.ui.*).
- 테스트 버전
- v2.1.291
- 마지막 테스트
- 필요 버전
- Claude Code ≥ 2.1.287
- 표시 위치
- 토스트
Claude Code 안에서 설치:
/plugin install cm-block-dangerous-commands --marketplace rotbit/claudemods-marketplace이 모드는 무엇을 하나요?
이 모드는 Claude Code 위험한 명령 차단 기능을 제공하여, Claude Code가 Bash 도구로 실행하려는 위험한 명령을 막아 줍니다. 셸 명령이 실행되기 전에 짧은 규칙 목록과 대조하여 검사합니다. 규칙에 일치하면 명령이 거부되고, Claude에게는 어떤 규칙이 왜 작동했는지 전달되며, 사용자 화면에는 규칙 이름이 담긴 토스트가 표시됩니다. 안전한 명령은 아무 영향 없이 그대로 통과합니다.
내장 규칙은 다음을 다룹니다. /, ~, $HOME, . 또는 *에 대한 rm -rf, main이나 master로의 git push --force, git clean -fdx, SQL의 DROP TABLE, DROP DATABASE, DROP SCHEMA, TRUNCATE, chmod -R 777 /, mkfs, 디스크 장치에 쓰는 dd, 원시 디스크로의 출력 리디렉션, curl이나 wget의 출력을 셸로 파이프하는 명령, 그리고 고전적인 포크 폭탄입니다. git reset --hard는 선택적으로 켤 수 있는 규칙으로 제공됩니다. Claude Code 2.1.287 이상이 필요합니다.
데모
녹화 영상에서는 데모 프로젝트에서 Claude에게 파괴적인 작업을 요청합니다. 모드가 Bash 호출을 거부하고, 토스트에 일치한 규칙 이름이 표시되며, Claude는 거부 이유를 읽은 뒤 명령을 실행하지 않고 응답합니다.
설치
설치 블록에 있는 방법 중 하나를 사용하십시오. 가드는 다음 도구 호출부터 바로 적용되며, /reload-plugins 이후에는 재시작할 필요가 없습니다.
$ install cm-block-dangerous-commands
Claude Code 2.1.287 이상 필요
1.Claude Code 안에서 한 줄로
/plugin install cm-block-dangerous-commands --marketplace rotbit/claudemods-marketplace실행 중인 세션(v2.1.275 이상)에 붙여 넣으세요. Claude Code가 먼저 마켓플레이스 추가 여부를 묻습니다.
2.셸에서 설치
claude plugin marketplace add rotbit/claudemods-marketplace claude plugin install cm-block-dangerous-commands@claudemods그런 다음 이미 열려 있는 세션에서 /reload-plugins를 실행하세요.
3.설치하지 않고 사용해 보기
git clone https://github.com/rotbit/claudemods-marketplace claude --plugin-dir ./claudemods-marketplace/cm-block-dangerous-commands한 세션에서만 모드를 불러옵니다. 설정에는 아무것도 추가되지 않습니다.
작동 방식
모든 로직은 하나의 tool.call 훅 안에 있습니다. hooks/register.ts의 코드는 다음과 같습니다.
on('tool.call', { tool: 'Bash' }, ($, e, next) => {
const match = findMatch(e.command, settings)
if (match === undefined) return next(e)
if (settings.mode === 'warn') {
$.ui.toast(`${$.plugin.name}: "${match.name}" is running (warn mode)`)
return next(e)
}
$.ui.toast(`${$.plugin.name}: blocked "${match.name}"`)
return { deny: denyReason($.plugin.name, match) }
}).catch(($, e, next) =>
next.called
? next(e)
: { deny: `${$.plugin.name}: its check failed, so the command was not run to be safe.` },
)매처 { tool: 'Bash' }는 이 훅이 셸 명령만 본다는 뜻입니다. hooks/rules.ts의 findMatch는 먼저 allowPatterns를 확인하고, 이어서 내장 규칙(꺼 둔 규칙은 건너뜀), 마지막으로 사용자의 extraPatterns를 확인합니다. 일치하는 규칙이 없으면 next(e)가 평소처럼 명령을 실행합니다. 일치하면 훅이 { deny: reason }을 반환하고, 그 이유가 Claude가 읽는 도구 결과가 됩니다.
이 모드를 단순한 필터가 아닌 가드로 만드는 것은 .catch 핸들러입니다. next가 호출되기 전에 검사가 예외를 던지면 호출은 허용되지 않고 거부됩니다. 즉, 모드는 실패 시 차단(fail closed) 방식으로 동작합니다. 또한 session.start 훅은 사용자 지정 패턴 중 올바른 정규식이 아닌 것이 있으면 토스트를 한 번 표시합니다.
rules.ts의 각 규칙은 ID, 이름, 한 문장짜리 사유, 그리고 테스트에서 검증하는 예시 명령으로 이루어진 단순한 데이터입니다.
사용자 지정
다음 옵션은 /config에서 변경할 수 있습니다. mode: warn으로 설정하면 가드가 알림 도구로 바뀌어, 일치하는 명령도 그대로 실행되고 토스트만 표시됩니다. extraPatterns와 allowPatterns는 항목 하나에 JavaScript 정규식 하나를 받습니다. 내장 규칙을 바꾸려면 hooks/rules.ts의 RULES 배열에서 해당 규칙의 pattern을 수정하십시오.
| 설정 | 유형 | 기본값 | 설명 |
|---|---|---|---|
| mode | string (block | warn) | "block" | Mode. block refuses a matching command; warn lets it run and shows a toast. |
| blockForcePush | boolean | true | Block force-push to main/master. Refuse git push --force / -f / +main to main or master. |
| blockHardReset | boolean | false | Block git reset --hard. Also refuse git reset --hard (off by default: it is a common, recoverable-ish workflow). |
| extraPatterns | string | [] | Extra patterns. Additional JavaScript regular expressions; a Bash command matching any of them is treated as dangerous. |
| allowPatterns | string | [] | Allow patterns. JavaScript regular expressions; a Bash command matching any of them is never blocked, whatever else it matches. |
Claude Code에서 /config로 변경하세요. 모드가 즉시 다시 로드됩니다.
권한 및 안전
도구 호출 가로채기는 이 모드가 존재하는 이유 그 자체입니다. 모드는 모든 Bash 명령을 실행 전에 확인하고 거부할 수 있습니다. 명령을 고쳐 쓰지 않으며, 직접 명령을 실행하지도 않습니다. UI 변경은 토스트 표시에 해당합니다. 그 밖에 자체적인 파일, 네트워크, 모델, 명령 접근 권한은 없습니다.
이 모드는 실수를 막기 위한 보호 장치이지 샌드박스가 아닙니다. 패턴을 피하도록 만든 명령은 통과할 수 있으므로 Claude Code의 권한 확인 프롬프트는 켜 두십시오. 모드를 끄려면 /plugin disable cm-block-dangerous-commands를 실행하고, 모든 모드를 끈 채 세션을 시작하려면 claude --safe-mode를 사용하십시오.
- 도구 호출 가로채기
- Claude가 하는 모든 도구 호출을 볼 수 있고(tool.call / tool.check), 이를 차단하거나 변경할 수 있습니다.
- UI 변경
- Claude Code 화면에 밴드, 패널, 상태 텍스트, 토스트를 그립니다(ui.render / $.ui.*).
호환성 및 문제 해결
macOS 터미널에서 Claude Code 2.1.291로 테스트했습니다. 차단되어야 할 명령이 여전히 실행된다면 다음을 확인하십시오.
claude --version이 2.1.287 이상인지, 그리고/plugin에서 모드가 활성화되어 있는지 확인하십시오.- 셸에서 설치했다면
/reload-plugins를 실행하십시오. /config에서mode가warn이 아니라block인지 확인하십시오.allowPatterns항목이 의도보다 넓은 범위와 일치하고 있지 않은지 확인하십시오.- 가드는
Bash도구만 다룹니다.Edit과Write를 통한 파일 편집은 검사하지 않습니다.
안전한 명령이 거부된다면 모드 전체를 경고 모드로 바꾸기보다 범위가 좁은 허용 패턴을 추가하십시오.
자주 묻는 질문
- 이 모드가 Claude Code의 권한 확인 프롬프트를 대신하나요?
- 아닙니다. 흔한 실수를 막기 위한 패턴 기반 가드일 뿐입니다. 난독화된 명령은 정규식을 빠져나갈 수 있으므로 권한 확인 프롬프트와 거부(deny) 규칙은 계속 켜 두십시오.
- 명령이 차단되면 Claude에게는 무엇이 보이나요?
- 호출이 거부되면서 이유가 함께 전달됩니다. 이유에는 규칙 이름과 차단 사유가 담기고, 사용자에게 직접 실행을 요청하거나 /config에서 allowPatterns 또는 mode를 조정하라는 제안이 포함됩니다. Claude는 보통 더 안전한 명령을 고르거나 사용자에게 묻습니다.
- 특정 명령 하나만 허용하려면 어떻게 하나요?
- /config의 allowPatterns에 정규식을 추가하십시오. 여기에 일치하면 내장 규칙과 extraPatterns보다 항상 우선합니다.
- git reset --hard도 차단되나요?
- 기본값으로는 차단되지 않습니다. 흔히 쓰이고 의도적으로 실행하는 경우가 많은 작업이기 때문입니다. 차단하려면 blockHardReset을 켜십시오.
- 모드 자체에 오류가 나면 어떻게 되나요?
- tool.call 훅은 실패 시 차단(fail closed) 방식으로 동작합니다. 명령이 실행되기 전에 검사가 예외를 던지면, 검사에 실패했다는 메시지와 함께 명령이 거부됩니다.
# 관련 모드

프롬프트 위 Git 브랜치
Claude Code 프롬프트 위 한 줄 띠에 git 브랜치, 변경된 파일 수, ahead/behind 상태를 표시합니다.
- 프롬프트 위
- 명령어 실행
- 도구 호출 가로채기
- UI 변경
v2.1.291에서 테스트됨

완료 토스트
긴 Claude 턴이 끝나면 "Done in 2m 14s" 토스트와 짧은 알림음을 내고, 데스크톱 알림도 선택적으로 보냅니다.
- 토스트
- 명령어 실행
- UI 변경
- 소리 재생
v2.1.291에서 테스트됨

도구 호출 카운터
Claude의 도구 호출을 턴별·세션별로 세어 스피너 옆에 표시하고, 상세 내역을 보는 /tally 명령을 추가합니다.
- 스피너
- 대화 기록
- 상태 표시줄
- 도구 호출 가로채기
- UI 변경
- 명령어/도구 추가
v2.1.291에서 테스트됨
더 보기: 안전 가드, Git 및 GitHub.