AI 도서관 · Claude · 하네스 설정 · Hooks
rm -rf 같은 명령을 실행 전에 걸러냅니다. 보조 장치이지 보안 경계는 아닙니다
⚠️ 인터넷에 도는 예제 대부분이 틀립니다. 세 가지를 먼저 짚습니다.
① 입력은 표준입력(stdin) JSON 입니다. 환경변수가 아닙니다.
② 차단은 exit 2 입니다. exit 1 은 그냥 오류로 처리되고 작업은 진행됩니다.
③ jq 가 없으면 값이 비어 그대로 통과합니다. 조용히 무력화되는 게 가장 위험합니다.
■ 1단계 — 스크립트 파일로 만듭니다
.claude/hooks/block-dangerous.sh
#!/usr/bin/env bash
set -u
PATTERN='rm -rf|git push --force|DROP TABLE|DELETE FROM'
input=$(cat)
if command -v jq >/dev/null 2>&1; then
cmd=$(printf '%s' "$input" | jq -r '.tool_input.command // empty'); parsed=$?
elif command -v node >/dev/null 2>&1; then
cmd=$(printf '%s' "$input" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{try{const j=JSON.parse(s);process.stdout.write((j.tool_input&&j.tool_input.command)||"")}catch(e){process.exit(1)}})'); parsed=$?
else
echo "훅 검사 불가: jq 또는 node 가 필요합니다" >&2; exit 2
fi
if [ "$parsed" -ne 0 ]; then echo "훅 검사 불가: JSON 해석 실패" >&2; exit 2; fi
if printf '%s' "$cmd" | grep -qE "$PATTERN"; then
echo "차단됨: $cmd" >&2; exit 2
fi
exit 0
■ 2단계 — 설정에서 이 스크립트를 부릅니다
.claude/settings.local.json
{
"hooks": {
"PreToolUse": [
{ "matcher": "Bash",
"hooks": [ { "type": "command",
"command": "bash \"$CLAUDE_PROJECT_DIR/.claude/hooks/block-dangerous.sh\"" } ] }
]
}
}
■ 3단계 — 반드시 시험하고 쓰세요
S=.claude/hooks/block-dangerous.sh
echo '{"tool_input":{"command":"rm -rf /"}}' | bash $S; echo $? → 2 (차단)
echo '{"tool_input":{"command":"ls -la"}}' | bash $S; echo $? → 0 (통과)
echo 'not json' | bash $S; echo $? → 2 (막힘)
✅ 위 세 가지가 그대로 나오면 정상입니다. 하나라도 다르면 쓰지 마세요.
🚧 한계 — 반드시 알고 쓰세요
문자열 패턴 검사라 우회됩니다. 변수에 담거나 철자를 바꾸면 통과합니다.
실수를 줄여주는 보조 장치일 뿐 보안 경계가 아닙니다.
"이게 있으니 안전하다"고 믿고 권한을 넓히는 것이 이 훅을 쓰는 가장 위험한 방법입니다.
💡 Windows는 Git Bash 나 WSL 에서 쓰세요. node 만 있어도 동작합니다.
차단할 패턴 추가: {{INPUT}}
🔎 실제로 겪은 오탐 사례
이 훅을 켠 직후, 커밋 메시지에 패턴 문자열을 인용했다는 이유만으로
git commit 명령 자체가 차단됐습니다. 명령이 위험해서가 아니라
명령 문자열 안에 그 글자가 들어 있었기 때문입니다.
→ 문서를 쓰거나 로그를 다룰 때 오탐이 자주 납니다.
→ 오탐이 성가시면 패턴을 좁히거나, 차단 대신 경고만 하도록 바꾸세요.
→ 반대로 패턴을 넓히면 우회는 여전히 가능한데 오탐만 늘어납니다.
이 균형점을 직접 정해야 한다는 것이 이 방식의 본질적 한계입니다.
{{INPUT}} 자리에 내 내용을 넣어 쓰는 프롬프트입니다. 아래 버튼으로 열면 넣는 칸이 나옵니다.
도서관에서 열기 — 내 내용 넣고 복사하기