Skip to content

Bug: Hook 配置中 jq 命令引号转义错误导致 Bash 工具无法执行 #73

@ljh740

Description

@ljh740

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"
      }
    ]
  }
}

重现步骤

  1. 使用 CCW 生成包含 PreToolUse hook 的配置文件
  2. 尝试在 Claude Code 中执行任何 Bash 命令(如 git status
  3. 观察到 hook 错误,所有 Bash 命令都无法执行

影响范围

CCW 生成的 hook 配置中,以下 6 个 hooks 存在引号转义问题:

  1. PreToolUse hook - 危险命令检测

    • 问题:使用双引号导致 jq 命令解析失败
    • 影响:完全阻止所有 Bash 工具调用,严重影响 Claude Code 工作流程
  2. 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,应该:

  1. 使用单引号作为 bash -c 的外层引号
  2. 或者提供更好的转义处理逻辑
  3. 在生成配置后进行语法验证测试

环境信息

  • OS: macOS (Darwin 25.2.0)
  • Claude Code: 最新版本
  • CCW: 通过 ccw hook session-context --stdin 命令生成的配置

相关文件

  • .claude/settings.json - CCW 生成的 hook 配置文件

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions