博客 · 2026-11-06

五分之一的 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 之前会做的三项检查:

  1. 找到 SKILL.md 点名的脚本,在里面搜一搜。 搜 curl、requests、fetch、wget(联网),rm -rf、shutil.rmtree(递归删除),脚本里直接执行的 pip install、npm install,以及名字里带 KEY、TOKEN、SECRET 的环境变量。这些和 skill 自称的功能对得上,就没问题。
  2. 读 allowed-tools。 列出的工具,在调用这个 skill 的那一轮里不弹权限确认就能用。Bash(git status *) 只放行这一条命令,单写一个 Bash 就放行任意命令。官方文档还提到,这个字段不受工作区信任限制:在一个你从没信任过的文件夹里,项目 skill 的这一行照样生效。
  3. 在 SKILL.md 里搜 !`。 像 !`git diff HEAD` 这样的一行,会在 skill 载入时、Claude 读到它之前就执行,再把输出贴进正文。这个功能很好用,它也是一段在任何人看到之前就运行的代码。

怎么测的

  1. skill。 目录里全部 5,082 个社区 skill,也就是通过了我们审核的那些(目录另有 19 个 Anthropic 官方 skill,这次没算),读到 5,036 个;其余的仓库已删除或取不到。另外把 11 月审核剔掉的 317 个也读了,用来对比。
  2. 文件。 每个仓库取一次 GitHub 文件树,再按同一个 commit 下载 SKILL.md 和脚本。脚本指 skill 文件夹里的 .py、.sh、.js、.ts、.mjs、.rb、.pl、.ps1 文件。我们跳过属于另一个 skill 的子文件夹,以及 node_modules、测试、样例和构建产物,最多往下三层。
  3. 跑附带脚本。 SKILL.md 里写了其中某个文件名,就算这一类。下文说脚本做了什么,都只数这些被点名的脚本。
  4. 怎么读。 去掉注释后用规则匹配源码,没有安装或运行任何东西。我们人工抽查样本,修了四条多算的规则,比如只是打印出来、从没执行的 pip install 提示。

测试结果

目录里的 5,036 个 skill:

skill 做了什么数量占比
带脚本文件1,17523.3%
SKILL.md 让 Claude 跑其中某个脚本97919.4%
脚本写入或删除文件69113.7%
脚本启动别的程序3426.8%
脚本联网2725.4%
脚本联网,同时写文件2364.7%
脚本递归删除文件夹1222.4%
脚本读名字像密钥的环境变量1192.4%
脚本读密钥类变量,同时联网931.8%
脚本里写着凭据文件路径(.env、~/.ssh、~/.aws/credentials)571.1%
脚本自己安装依赖430.9%
脚本用 sudo100.2%
SKILL.md 写了 allowed-tools56311.2%
allowed-tools 预先放行 Write 或 Edit2494.9%
allowed-tools 预先放行任意 Bash 命令2334.6%
allowed-tools 只放行列出的 Bash 命令1513.0%
跑附带脚本,同时预先放行任意 Bash 命令501.0%
SKILL.md 用 !` 在载入时执行命令400.8%
SKILL.md 注册了整个会话都在的 hooks130.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 个,并把每一个对应到它公开的剔除原因。

审核剔除原因数量跑附带脚本脚本联网脚本写文件
绕过检测或平台规则3548.6%20.0%42.9%
不安全4139.0%14.6%29.3%
付费接口或广告引流6521.5%16.9%12.3%
只对作者本人或某一个项目有用4613.0%6.5%10.9%
占位文件、模板、演示或测试样例1086.5%0%0%
留在目录里的5,03619.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 收录前都经过审核。

来源

  1. Claude Code 文档:Skills(Pre-approve tools for a skill、Inject dynamic context) · official
  2. Agent Skills 规范 · official
  3. AgentCraft:我们审了 783 个新的 Claude Code skill,317 个没进目录 · blog