5겪은 일
만든 안전장치

- 실행 전에 막는 훅이에요. Claude가 셸 명령을 실행하기 직전(
PreToolUse)에 명령 문자열을 받아 보고, grep 식에 100 이상의 반복이 있거나 드라이브 전체를 재귀 검색하면 거부해요. 거부 이유와 함께 «파이썬으로 필요한 부분만 잘라 읽거나 반복을 100 아래로 줄이라»는 대안도 돌려줘요. - 남은 프로세스를 치우는 훅이에요. Claude가 답을 마칠 때(
Stop)와 세션을 시작할 때(SessionStart)마다, 10분 넘게 돌았거나 메모리를 4GB 넘게 먹은 grep 프로세스를 찾아 꺼요. 다른 프로그램은 건드리지 않아요.
첫째 훅을 줄여 보면 이래요. 파이썬 파일 하나로 끝나요.
# 큰 반복 정규식과 드라이브 전체 grep -r 을 실행 전에 거부한다
import json, re, sys
cmd = str((json.load(sys.stdin).get("tool_input") or {}).get("command", ""))
why = None
if re.search(r"\b[ef]?grep\b", cmd):
nums = [int(n) for n in re.findall(r"\\?\{\s*(?:\d+\s*,\s*)?(\d+)\s*\\?\}", cmd)]
if nums and max(nums) >= 100:
why = f"grep 식에 반복 {max(nums)}회, 메모리가 크게 불어날 수 있음"
elif re.search(r"grep\b.*\s-\w*[rR]\w*\b.*\s(/|c:[/\\]?|~/?)(\s|$)", cmd, re.I):
why = "드라이브 전체를 뒤지는 grep -r"
if why:
print(json.dumps({"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": why + ". 필요한 부분만 파이썬으로 잘라 읽거나 폴더를 좁히세요."}}, ensure_ascii=False))
등록은 ~/.claude/settings.json에 이렇게 해요.
{
"hooks": {
"PreToolUse": [
{ "matcher": "Bash", "hooks": [ { "type": "command", "command": "python ~/.claude/hooks/no_runaway_grep.py" } ] }
]
}
}
등록한 뒤에는 일부러 위험한 명령을 시켜 보고 정말 거부되는지 확인하세요. 이 사례에서는 시험 명령 10건으로 거부와 통과를 모두 확인한 뒤에 썼어요. 아래는 이 글의 코드에 명령 세 개를 넣어 실제로 돌린 결과예요.
