-
Notifications
You must be signed in to change notification settings - Fork 102
Closed
Description
Bug Report: PreToolUse Hook 生成的 jq 命令引号转义错误
问题描述
CCW 生成的 PreToolUse hook 配置在执行时会导致 jq 命令解析失败,所有 Bash 工具调用都会被阻止。
错误信息
PreToolUse:Bash hook error: [bash -c "INPUT=$(cat); CMD=$(echo \"$INPUT\" | jq -r \".tool_input.command // empty\"); ...]:
jq: error: syntax error, unexpected end of file, expecting QQSTRING_TEXT or QQSTRING_INTERP_START or QQSTRING_END (Unix shell quoting issues?) at <top-level>, line 1:
".tool_input.command
jq: 1 compile error
根本原因
CCW 生成的 hook 配置使用了双引号作为 bash -c 的外层引号,导致内部的 jq 命令引号被过度转义,jq 无法正确解析参数。
有问题的配置(CCW 生成的)
{
"hooks": {
"PreToolUse": [
{
"hooks": [
{
"type": "command",
"command": "bash -c \"INPUT=$(cat); CMD=$(echo \\\"$INPUT\\\" | jq -r \\\".tool_input.command // empty\\\"); DANGEROUS_PATTERNS=\\\"rm -rf|rmdir|del /|format |shutdown|reboot|kill -9|pkill|mkfs|dd if=|chmod 777|chown -R|>/dev/|wget.*\\|.*sh|curl.*\\|.*bash\\\"; if echo \\\"$CMD\\\" | grep -qiE \\\"$DANGEROUS_PATTERNS\\\"; then echo \\\"{\\\\\"hookSpecificOutput\\\\\":{\\\\\"hookEventName\\\\\":\\\\\"PreToolUse\\\\\",\\\\\"permissionDecision\\\\\":\\\\\"ask\\\\\",\\\\\"permissionDecisionReason\\\\\":\\\\\"Potentially dangerous command detected: requires user confirmation\\\\\"}}\\\" && exit 0; fi; exit 0\"",
"timeout": 5
}
],
"matcher": "Bash"
}
]
}
}修复后的配置
将 bash -c 的外层引号从双引号改为单引号,大大简化内部转义:
{
"hooks": {
"PreToolUse": [
{
"hooks": [
{
"type": "command",
"command": "bash -c 'INPUT=$(cat); CMD=$(echo \"$INPUT\" | jq -r \".tool_input.command // empty\"); DANGEROUS_PATTERNS=\"rm -rf|rmdir|del /|format |shutdown|reboot|kill -9|pkill|mkfs|dd if=|chmod 777|chown -R|>/dev/|wget.*\\|.*sh|curl.*\\|.*bash\"; if echo \"$CMD\" | grep -qiE \"$DANGEROUS_PATTERNS\"; then echo \"{\\\"hookSpecificOutput\\\":{\\\"hookEventName\\\":\\\"PreToolUse\\\",\\\"permissionDecision\\\":\\\"ask\\\",\\\"permissionDecisionReason\\\":\\\"Potentially dangerous command detected: requires user confirmation\\\"}}\"; exit 0; fi; exit 0'",
"timeout": 5
}
],
"matcher": "Bash"
}
]
}
}重现步骤
- 使用 CCW 生成包含 PreToolUse hook 的配置文件
- 尝试在 Claude Code 中执行任何 Bash 命令(如
git status) - 观察到 hook 错误,所有 Bash 命令都无法执行
影响范围
CCW 生成的 hook 配置中,以下 6 个 hooks 存在引号转义问题:
-
PreToolUse hook - 危险命令检测
- 问题:使用双引号导致 jq 命令解析失败
- 影响:完全阻止所有 Bash 工具调用,严重影响 Claude Code 工作流程
-
PostToolUse hooks(5 个) - 以下 hooks 存在同样的潜在问题:
- 文件写入通知(curl 调用 localhost:3456)
- ESLint 自动修复(针对 .js/.ts/.jsx/.tsx 文件)
- CodexLens 更新(代码分析工具集成)
- 工具使用日志记录(记录到 ~/.claude/tool-usage.log)
- Git 自动添加文件(Write 操作后自动 git add)
严重程度:
- Critical: PreToolUse hook 错误会立即阻止所有 Bash 命令执行
- High: PostToolUse hooks 虽然可能还未触发错误,但存在同样的引号转义问题
- 用户影响: 需要手动修复
.claude/settings.json才能恢复正常使用
建议修复
CCW 在生成 hook 配置时,对于包含复杂 shell 命令的 hook,应该:
- 使用单引号作为
bash -c的外层引号 - 或者提供更好的转义处理逻辑
- 在生成配置后进行语法验证测试
环境信息
- OS: macOS (Darwin 25.2.0)
- Claude Code: 最新版本
- CCW: 通过
ccw hook session-context --stdin命令生成的配置
相关文件
.claude/settings.json- CCW 生成的 hook 配置文件
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels