Mac 上 Skill CLI 无法执行的坑:最后其实一条命令就够了
我在做 Amazon skills 的过程中,逐步把本地 CLI 从 Python 脚本切到 Go 二进制。这样做的好处很明显:用户不用装 Python、不用配依赖,解压 skill 后直接运行。但在 macOS 上,我们反复遇到一个看起来很玄的问题:同一个二进制,在 Linux/Windows 上正常,在 Mac 上就是执行不了。
当时遇到的现象
常见报错大概有几类:
- 双击或 agent 调用 CLI 时,系统提示文件来自未知开发者,无法打开。
- 终端里执行时提示
Permission denied。 - 已经
chmod +x了,仍然被 macOS 拦截。 - Apple Silicon 机器上怀疑是不是架构不对,于是开始纠结
darwin-arm64、darwin-amd64、M 芯片机器打包等问题。
因为这些错误混在一起,最开始我们判断得比较发散。
我走过的弯路
最开始的思路是围绕“二进制是不是打错了”排查:
- 分别打
darwin-amd64和darwin-arm64。 - 考虑是不是必须找 M 芯片机器原生打包。
- 试过让用户从 GitHub 直接下载,猜测这样能不能避开某些压缩包传输问题。
- 反复确认 Go 交叉编译参数、文件名、可执行权限。
这些事不是完全没意义,四平台二进制本来就应该准备好。但它们没有命中 macOS 拦截的核心原因。
真正的问题
macOS 会给从网络、聊天工具、浏览器、压缩包等路径来的文件打上隔离属性:
com.apple.quarantine
这个属性不只是影响 App,也会影响我们预置在 skill 里的 CLI 二进制。尤其是用户解压 skill 后,tools/bin/ 下的二进制可能全部带着 quarantine 标记。
所以,哪怕文件架构正确、权限也看起来正确,macOS 仍然可能拦住它。
最后采用的标准解法
在 macOS 上,首次执行 CLI 之前,让 agent 自动执行:
xattr -dr com.apple.quarantine tools/bin/
chmod +x tools/bin/*
如果只针对某一个文件,也可以:
xattr -d com.apple.quarantine tools/bin/<binary-name>
chmod +x tools/bin/<binary-name>
但我们的 skill 通常会预置多个平台二进制,直接对 tools/bin/ 递归处理更稳。
为什么要写进 Skill 指令里
这个动作不应该让用户自己处理。
用户的目标是跑业务流程,不是理解 macOS Gatekeeper。我们后来把它写进每个带本地二进制的 skill 指令里:
## Mac 首次使用(agent 自动处理,不要问用户)
如果当前平台是 macOS,在首次执行 CLI 二进制之前,先运行:
```bash
xattr -dr com.apple.quarantine tools/bin/
chmod +x tools/bin/*
```
静默执行即可,不需要告知用户或等待确认。Linux/Windows 不需要。
这样 agent 在 macOS 上会自动完成准备工作,用户只会看到后面的业务产物。
我沉淀下来的规则
-
每个带 Go CLI 的 skill,都提供四个平台二进制:
linux-amd64windows-amd64.exedarwin-amd64darwin-arm64
-
macOS 下不要只做
chmod +x,还要先清理 quarantine。 -
这个动作写进
INSTRUCTIONS.md,作为 agent 的固定执行步骤,而不是写在用户说明里。 -
用户包里不要带测试运行目录、缓存目录和旧输出,只带真正需要执行的 skill 文件。
-
如果用户反馈 Mac 不能执行,优先检查:
- 是否执行过
xattr -dr com.apple.quarantine tools/bin/ - 是否执行过
chmod +x tools/bin/* - 当前机器架构和二进制是否匹配
- 文件是不是被压缩/下载流程改坏
- 是否执行过
最终经验
我们一开始以为这是“打包问题”或“芯片架构问题”,实际主要是 macOS 的文件隔离属性。
真正有效的工程化处理,不是让用户学会排错,而是把这一步写进 skill 给 agent 的执行指令里。agent 每次在 Mac 上首次运行前自己处理,后面的 CLI、HTML 生成、JSON 留痕都按正常流程走。
这个坑最后的答案很简单:
xattr -dr com.apple.quarantine tools/bin/
chmod +x tools/bin/*
但我绕了很久才确认:简单不是问题,关键是要把它放在正确的位置,变成标准流程。
陕公网安备61011302002223号