博客 · 2026-11-06

信任一个 clone 来的仓库之前,先读它的 .claude/settings.json:5,864 个公开仓库都开了什么

我们读了 5,864 个活跃公开仓库的项目设置:54% 定义了钩子,20% 在会话开始时就运行一个。钩子和 env 在 claude -p 下、任何信任提示出现之前就生效。

概述

在 clone 来的仓库里打开 Claude Code 之前,打开它的 .claude/settings.json,读四个键:hooks、env、permissions 和 enableAllProjectMcpServers。如果你要在这个仓库里无头运行 Claude Code,加上文档推荐的两个参数之一。

原因很简单。仓库的设置文件并不是全部都要等你信任文件夹才生效。文档把它分成两半:

  • 信任之前就会用的: 文件里的 hooks、env 块,以及 apiKeyHelper 这类辅助命令。你只信任了上级文件夹时会用,每一次 claude -p 或 SDK 运行也会用,而这两种运行从不弹信任提示。
  • 要等信任对话框的: permissions.allow 规则和 additionalDirectories。对话框会列出这个文件夹要授予的规则和目录,让你先看一遍。

所以,一个设置文件可以在你看到任何对话框之前,就在你的机器上运行命令;它的 env 还能改掉 Claude Code 把请求发往哪里。

那么实际有多常见?我们读了 5,864 个活跃公开仓库的项目设置。

推荐

下面是我们现在在别人写的仓库里运行 Claude Code 之前,会在 .claude/settings.json 里查的:

  1. hooks,先看 SessionStart。 每个钩子都是一条 shell 命令,SessionStart 钩子在会话开始时就运行。要读命令调用的脚本,别只看命令行。
  2. env。 找 ANTHROPIC_BASE_URL,它决定 Claude Code 把请求发到哪里;找 OTEL_EXPORTER_OTLP_*_ENDPOINT,它决定遥测发到哪里;也看看代理和证书类变量。
  3. 信任对话框列出 permissions 时,读完再接受。 每条 allow 规则都要读:Bash(python:*)、Bash(node:*) 或 Bash(npx:*) 等于让任何代码都能经由这个解释器运行;Bash(rm:*)、Bash(curl:*)、Bash(git push:*) 放行的就是字面上的事。也看看 defaultMode 和 additionalDirectories。
  4. enableAllProjectMcpServers 和 enabledMcpjsonServers。 它们会预先批准仓库 .mcp.json 里的服务器。

在一个没审过的仓库里无头运行时,文档给了两个参数:

  • claude -p --setting-sources user "…":既不读项目的设置文件,也不读它的 .mcp.json。
  • claude -p --settings '{"disableAllHooks": true}' "…":这次运行关掉钩子。只在你自己的用户设置里写 disableAllHooks 不够,因为仓库的项目设置优先级更高,可以把它改回 false。

还有一个文件:被 git 跟踪的 .claude/settings.local.json 会被当成仓库提供的配置,同样要审。

怎么测的

  1. 找设置文件。 GitHub 代码搜索 filename:settings.json path:.claude 报约 91,976 个文件。每次搜索最多返回 1,000 条,所以我们按文件大小切成 95 段。
    • 30 分钟的第一轮只跑完 7 段,全在 300 字节以下。之后两轮短的补跑,每段取一页,所以每个大小区间都有样本,搜索总共约 53 分钟。
    • 我们报告的样本每段最多留 100 个文件,共 9,174 个,这样没有哪个大小区间压过别的。用全部 14,178 个样本文件算,任何比例的变化都不到半个百分点。
  2. 筛仓库。 至少 5 星、10 月 7 日以后有推送、不是分叉、没有归档,剩 5,864 个仓库。
  3. 读这些仓库里的全部项目设置文件。 共 6,099 个,外加钩子点名的脚本。按 JSON 解析,只记键名和类别,不记任何值,什么都没运行。
  4. 按仓库算。 有至少一个设置文件做了某件事的仓库占多少。大多数仓库只有一个设置文件,按文件算结果一样。

测试结果

信任之前就会用的

仓库的设置做了什么仓库(共 5,864)
定义了 shell 钩子53.7%
会话开始时运行钩子(SessionStart 或 Setup)20.3%
每次工具调用之前运行钩子(PreToolUse)28.5%
每次工具调用之后运行钩子(PostToolUse)27.3%
你每发一条提示词就运行钩子(UserPromptSubmit)7.0%
钩子脚本会写文件20.6%
钩子脚本会联网4.7%
设置了环境变量(env)8.5%
设置了状态栏命令3.1%

要等信任对话框的

仓库的设置放行了什么仓库
任意 allow 规则47.2%
给解释器或启动器放行 Bash(python、node、bash、npx 等)19.8%
给 rm、curl、sudo、ssh、git push 一类放行 Bash11.4%
MCP 工具9.6%
不限路径的 Write 或 Edit4.9%
不限站点的 WebFetch3.2%
额外的工作目录3.0%
任意 Bash 命令2.4%
默认模式设为 auto、dontAsk、acceptEdits 或 bypassPermissions3.2%(只算 bypassPermissions:0.9%)

MCP 服务器和插件: 19.0% 启用了插件或添加了插件市场,2.6% 预先批准了指定的 .mcp.json 服务器,2.4% 批准了全部。

限制类,好的那种: 20.3% 加了 deny 规则,5.7% 加了 ask 规则,1.0% 打开了沙箱。

大家猜猜看,有多少个仓库的设置文件会改掉 Claude Code 把请求发往哪里?很少:5,864 个里有 8 个设了 ANTHROPIC_BASE_URL。3 个指向 localhost;5 个指向远程的模型网关或别家模型服务的接口,看起来是作者在用自己的网关。如果你在这样的仓库里跑 claude -p,你的请求也会发到那里。另有 4 个把 OpenTelemetry 数据发到作者设的远程收集端。

在能靠关键词看出用途的钩子里,PreToolUse 钩子大多是拦截或检查命令的守卫,PostToolUse 钩子常是格式化和 lint。很多钩子匹配不上任何关键词,所以这只是个方向,不是计数。

该忽略什么

文件的长短。一个写满 deny 规则的长设置文件是在保护你;一个只有三行、却带着一个 SessionStart 钩子和一个 ANTHROPIC_BASE_URL 的文件,才更值得细读。要看的是什么在信任对话框之前就运行,以及请求发到了哪里。

局限

  • 是抽样。 约 10% 的匹配文件,来自 5 星以上的活跃仓库,截至 2026 年 11 月 6 日。代码搜索在每段里按相关度返回结果,所以不是随机样本。
  • 只看静态文本。 我们没有运行任何钩子,所以不知道每个钩子运行时做什么,也不知道遥测发了什么。
  • 统计的是能力,不是意图。 这里几乎都是作者在配置自己的工作流。我们人工读过的部分没有像恶意的,但没有把每个钩子都读一遍。
  • 只看键名。 除了接口地址变量的主机名,我们没读任何环境变量的值。

自己复现

上面的数字在 project-settings-2026-11.json 里,仓库名和所有的值都去掉了。想自己检查一个仓库,打开 .claude/settings.json,读第一节说的四个键。

clone 来的仓库还有另一半,.claude/skills/ 文件夹,见我们对 41,142 个项目 skill 的审查。

所有检查都汇总在一页:Claude Code 安全检查清单。

来源

  1. Claude Code 文档:Permissions(What runs before you trust a folder、Project allow rules and workspace trust) · official
  2. Claude Code 文档:Hooks · official
  3. AgentCraft:在别人的仓库里打开 Claude Code 之前,先看看它的 .claude/skills 文件夹 · blog