五分之一的 Claude Code skill 会跑附带脚本:我们读了这些脚本在做什么
我们在不运行的前提下,读了 5,036 个 Claude Code skill 的 SKILL.md 和附带脚本:19% 会让 Claude 跑附带脚本,5% 带会联网的脚本,5% 预先放行了任意 Bash 命令。
概述
装一个 Claude Code skill 之前,打开它的文件夹,找找有没有 scripts/ 目录。如果 SKILL.md 让 Claude 去跑里面的某个文件,就把那个文件读一遍,顺便看看 skill 的 allowed-tools 那一行。
原因很简单。skill 不只是一段说明。我们从目录里读到的 5,036 个社区 skill 中,有 979 个,差不多五个里有一个,在 SKILL.md 里让 Claude 运行 skill 自带的脚本。这个脚本在你的电脑上、以你的权限运行。如果 skill 的 allowed-tools 里写了 Bash,那一轮里 Claude 跑它、跑别的 shell 命令,都不会再问你。
大家猜猜看,这些脚本里有多少会联网?272 个 skill,大约二十个里有一个。很多是在调 skill 本身要用的接口,其中 93 个还会读名字像密钥的环境变量,比如 API key。
推荐
下面是我们现在装 skill 之前会做的三项检查:
- 找到 SKILL.md 点名的脚本,在里面搜一搜。 搜
curl、requests、fetch、wget(联网),rm -rf、shutil.rmtree(递归删除),脚本里直接执行的pip install、npm install,以及名字里带KEY、TOKEN、SECRET的环境变量。这些和 skill 自称的功能对得上,就没问题。 - 读
allowed-tools。 列出的工具,在调用这个 skill 的那一轮里不弹权限确认就能用。Bash(git status *)只放行这一条命令,单写一个Bash就放行任意命令。官方文档还提到,这个字段不受工作区信任限制:在一个你从没信任过的文件夹里,项目 skill 的这一行照样生效。 - 在 SKILL.md 里搜
!`。 像!`git diff HEAD`这样的一行,会在 skill 载入时、Claude 读到它之前就执行,再把输出贴进正文。这个功能很好用,它也是一段在任何人看到之前就运行的代码。
怎么测的
- skill。 目录里全部 5,082 个社区 skill,也就是通过了我们审核的那些(目录另有 19 个 Anthropic 官方 skill,这次没算),读到 5,036 个;其余的仓库已删除或取不到。另外把 11 月审核剔掉的 317 个也读了,用来对比。
- 文件。 每个仓库取一次 GitHub 文件树,再按同一个 commit 下载 SKILL.md 和脚本。脚本指 skill 文件夹里的
.py、.sh、.js、.ts、.mjs、.rb、.pl、.ps1文件。我们跳过属于另一个 skill 的子文件夹,以及node_modules、测试、样例和构建产物,最多往下三层。 - 跑附带脚本。 SKILL.md 里写了其中某个文件名,就算这一类。下文说脚本做了什么,都只数这些被点名的脚本。
- 怎么读。 去掉注释后用规则匹配源码,没有安装或运行任何东西。我们人工抽查样本,修了四条多算的规则,比如只是打印出来、从没执行的 pip install 提示。
测试结果
目录里的 5,036 个 skill:
| skill 做了什么 | 数量 | 占比 |
|---|---|---|
| 带脚本文件 | 1,175 | 23.3% |
| SKILL.md 让 Claude 跑其中某个脚本 | 979 | 19.4% |
| 脚本写入或删除文件 | 691 | 13.7% |
| 脚本启动别的程序 | 342 | 6.8% |
| 脚本联网 | 272 | 5.4% |
| 脚本联网,同时写文件 | 236 | 4.7% |
| 脚本递归删除文件夹 | 122 | 2.4% |
| 脚本读名字像密钥的环境变量 | 119 | 2.4% |
| 脚本读密钥类变量,同时联网 | 93 | 1.8% |
脚本里写着凭据文件路径(.env、~/.ssh、~/.aws/credentials) | 57 | 1.1% |
| 脚本自己安装依赖 | 43 | 0.9% |
脚本用 sudo | 10 | 0.2% |
SKILL.md 写了 allowed-tools | 563 | 11.2% |
allowed-tools 预先放行 Write 或 Edit | 249 | 4.9% |
allowed-tools 预先放行任意 Bash 命令 | 233 | 4.6% |
allowed-tools 只放行列出的 Bash 命令 | 151 | 3.0% |
| 跑附带脚本,同时预先放行任意 Bash 命令 | 50 | 1.0% |
SKILL.md 用 !` 在载入时执行命令 | 40 | 0.8% |
| SKILL.md 注册了整个会话都在的 hooks | 13 | 0.3% |
举几个例子,都不点名:
- 联网。 一个网站审计 skill 会抓取它要打分的线上页面;一个图数据库 skill 调厂商的 REST 接口来创建和运行 agent。两者联网,都是因为这就是它们的工作。
- 密钥。 一个 SEO 检查 skill 从
~/.config/<工具名>/.env读自己的 API key,所以代码里写着.env。这一行也值得读一读,因为同样的代码读得了你能读的任何文件。 - 删除。 一个音乐视频 skill 用
shutil.rmtree删掉一个项目文件夹。递归删除要看清它删的是哪个路径。 - 安装。 一个幻灯片 skill 的 PPTX 导出脚本,会在 skill 自己的文件夹里执行
npm install。 - 任意 Bash 命令。 一个实验循环 skill 预先放行了 Read、Write、Edit、Bash 和 Agent,并且会跑它自带的树脚本。在那一轮里,这些工具都不会先问你。
- 载入即执行。 一个记忆检索 skill 用
!`,在载入时就运行插件目录里的一个脚本。
979 个里很多都很普通:脚手架脚本给自己建文件夹,部署脚本清理临时目录。三项检查的目的,是确认脚本做的事和 skill 说的一致。
剔掉的 skill 说明了什么
11 月的审核读了 783 个新 skill,剔掉 317 个。我们用同样的方法读了这 317 个,并把每一个对应到它公开的剔除原因。
| 审核剔除原因 | 数量 | 跑附带脚本 | 脚本联网 | 脚本写文件 |
|---|---|---|---|---|
| 绕过检测或平台规则 | 35 | 48.6% | 20.0% | 42.9% |
| 不安全 | 41 | 39.0% | 14.6% | 29.3% |
| 付费接口或广告引流 | 65 | 21.5% | 16.9% | 12.3% |
| 只对作者本人或某一个项目有用 | 46 | 13.0% | 6.5% | 10.9% |
| 占位文件、模板、演示或测试样例 | 108 | 6.5% | 0% | 0% |
| 留在目录里的 | 5,036 | 19.4% | 5.4% | 13.7% |
因为不安全被剔掉的 skill,跑附带脚本的比例是留下的 2.0 倍(39.0% 对 19.4%),因为绕过平台规则被剔掉的是 2.5 倍(48.6%)。它们的脚本联网的比例分别是 2.7 倍和 3.7 倍(14.6%、20.0% 对 5.4%)。模板和演示几乎不带脚本,把剔除组的整体平均拉到 20.2%,和留下的 19.4% 很接近。
所以,脚本是 skill 里很正常的一部分。在审核因为安全和违规剔掉的两组里,脚本出现的比例是留下的 2 到 2.5 倍,这些脚本联网的比例是 2.7 到 3.7 倍。最值得去读脚本的,就是这类 skill。
该忽略什么
脚本文件的数量。带四十个辅助脚本的 skill 可能毫无问题,只带一个的也可能把你的密钥发到别处。要读的是 SKILL.md 真正点名的那几个。
局限
- 只看静态文本。 被点名的脚本不一定每次都运行。规则会漏掉运行时拼出来的调用,也会匹配到字符串里的命令。联网的计数里有少量浏览器端代码在读本地文件;凭据路径的计数里有安全扫描器,它们列出这些路径是为了拦截。
- 一次快照。 skill 是陆续收进目录的,我们按 2026 年 11 月 6 日各仓库当前的 commit 读脚本,有些作者在收录之后改过。
- 不是因果。 剔除组是审核挑出来的,不是随机样本。对比只说明哪类问题常和脚本一起出现,不能说明脚本导致 skill 被剔。
- 统计的是能力,不是意图。 我们没有判断哪个脚本滥用了它的能力。
自己复现
上面的数字,包括留下的、剔掉的和每个剔除原因,都在 skill-scripts-2026-11.json 里,仓库名和 skill 名都去掉了。想自己检查一个 skill,打开它的文件夹,找到 SKILL.md 提到的文件名,按第一项检查里的关键词搜一遍。
留下的 skill 都在 AgentCraft skills 目录里,附安装命令:5,101 个 Claude Code skill,每个社区 skill 收录前都经过审核。