chmod +x无效是因为macos 10.15+在execve()阶段由gatekeeper拦截未公证二进制,触发“operation not permitted”或静默失败,与文件权限无关;本质是签名与公证缺失导致内核级拒绝加载。

不是 chmod +x 能解决的问题——macOS 上报“Operation not permitted”或双击无响应,99% 是 Gatekeeper 拦截未公证二进制,和文件权限无关。
为什么 chmod +x 无效
macOS 10.15+ 对非 App Store 分发的可执行文件强制执行公证(notarization)策略:即使 ls -l 显示 -r-xr-xr-x,系统内核在 execve() 阶段就直接拒绝加载,错误表现为 Operation not permitted 或静默失败。这不是文件没执行位,是 Apple 的安全机制在起作用。
- 用
file frankenphp确认是 Mach-O 二进制(而非脚本),再运行ls -l frankenphp—— 若已有x权限却仍打不开,基本可排除 chmod 问题 - Homebrew 安装的通常不报错,因为它是本地编译生成的二进制,不受公证限制;但
brew install --binary安装的 bottle 若未公证,一样会触发拦截 - 下载来源很关键:GitHub Releases 页面直接下载的
frankenphp-darwin-arm64默认未公证,Safari/Chrome 下载后还会被自动打上com.apple.quarantine标记
三种实操路径怎么选
根据你当前场景选最匹配的一种,不要叠加使用:
-
首次验证/临时跑通:右键点击
frankenphp→ “打开”,在弹窗中点“仍要打开”。这会为该文件单独豁免一次,不影响系统全局策略 -
命令行快速清理(仅对浏览器下载有效):运行
xattr -d com.apple.quarantine frankenphp。注意:若文件是从 curl/wget 下载且未经浏览器中转,此命令无效 -
开发机长期使用:运行
sudo spctl --master-disable,然后去“系统设置→隐私与安全性→安全性”里勾选“任何来源”。⚠️ 生产环境禁用此操作
启动后仍 Permission denied?再检查这两点
绕过 Gatekeeper 后还失败,说明问题已下沉到更底层:
- 确认运行的是真二进制,不是同名 shell 脚本覆盖:
which frankenphp和file $(which frankenphp)必须返回类似Mach-O 64-bit executable arm64 - 依赖库缺失会导致初始化阶段被内核拒绝,现象也是
Permission denied。macOS 上用otool -L frankenphp查依赖,重点关注标为not found的项(如libbpf.dylib、libssl.dylib);Linux 则用ldd frankenphp
真正卡住的地方往往不在“怎么给权限”,而在于没意识到 macOS 的执行拦截发生在比 chmod 更早的系统层——先确认是不是 Gatekeeper 在拦,再查依赖,最后才碰文件属主或 SELinux 这类传统权限问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











