信任一个 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 里查的:
hooks,先看SessionStart。 每个钩子都是一条 shell 命令,SessionStart 钩子在会话开始时就运行。要读命令调用的脚本,别只看命令行。env。 找ANTHROPIC_BASE_URL,它决定 Claude Code 把请求发到哪里;找OTEL_EXPORTER_OTLP_*_ENDPOINT,它决定遥测发到哪里;也看看代理和证书类变量。- 信任对话框列出
permissions时,读完再接受。 每条 allow 规则都要读:Bash(python:*)、Bash(node:*)或Bash(npx:*)等于让任何代码都能经由这个解释器运行;Bash(rm:*)、Bash(curl:*)、Bash(git push:*)放行的就是字面上的事。也看看defaultMode和additionalDirectories。 enableAllProjectMcpServers和enabledMcpjsonServers。 它们会预先批准仓库.mcp.json里的服务器。
在一个没审过的仓库里无头运行时,文档给了两个参数:
claude -p --setting-sources user "…":既不读项目的设置文件,也不读它的.mcp.json。claude -p --settings '{"disableAllHooks": true}' "…":这次运行关掉钩子。只在你自己的用户设置里写disableAllHooks不够,因为仓库的项目设置优先级更高,可以把它改回false。
还有一个文件:被 git 跟踪的 .claude/settings.local.json 会被当成仓库提供的配置,同样要审。
怎么测的
- 找设置文件。 GitHub 代码搜索
filename:settings.json path:.claude报约 91,976 个文件。每次搜索最多返回 1,000 条,所以我们按文件大小切成 95 段。- 30 分钟的第一轮只跑完 7 段,全在 300 字节以下。之后两轮短的补跑,每段取一页,所以每个大小区间都有样本,搜索总共约 53 分钟。
- 我们报告的样本每段最多留 100 个文件,共 9,174 个,这样没有哪个大小区间压过别的。用全部 14,178 个样本文件算,任何比例的变化都不到半个百分点。
- 筛仓库。 至少 5 星、10 月 7 日以后有推送、不是分叉、没有归档,剩 5,864 个仓库。
- 读这些仓库里的全部项目设置文件。 共 6,099 个,外加钩子点名的脚本。按 JSON 解析,只记键名和类别,不记任何值,什么都没运行。
- 按仓库算。 有至少一个设置文件做了某件事的仓库占多少。大多数仓库只有一个设置文件,按文件算结果一样。
测试结果
信任之前就会用的
| 仓库的设置做了什么 | 仓库(共 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 一类放行 Bash | 11.4% |
| MCP 工具 | 9.6% |
| 不限路径的 Write 或 Edit | 4.9% |
| 不限站点的 WebFetch | 3.2% |
| 额外的工作目录 | 3.0% |
| 任意 Bash 命令 | 2.4% |
默认模式设为 auto、dontAsk、acceptEdits 或 bypassPermissions | 3.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 安全检查清单。