◆

Mac 软件提示已损坏无法打开的解决方法 xattr

2025-09-24 13:110

为什么提示「已损坏」

这个提示很有误导性——文件其实一点没坏,是 macOS 的 Gatekeeper 在拦。

原理是这样:浏览器、下载工具从网上下载文件时,会给文件加一个叫 com.apple.quarantine 的扩展属性(extended attribute),标记「这东西来自互联网,不可信」。之后首次打开时 Gatekeeper 会检查这个标记,然后去验证 App 的代码签名和公证(notarization)。签名不存在、签名失效、或者没经过苹果公证,就会弹出「已损坏,无法打开」。

会撞上这个的典型情况有几类:开源软件作者没花钱买苹果开发者证书;从 GitHub Releases 下的构建产物;被第三方修改过导致原签名失效的 App;还有跨架构编译的一些工具。这些都不是真的损坏。

顺便说下,如果 App 有签名只是没公证,提示语通常是「无法打开,因为它来自身份不明的开发者」,这种右键点 App 选「打开」就能绕过,不用命令行。提示「已损坏」的是更严格的情况,右键打开也不管用。

解决方法

思路就是把那个 quarantine 标记清掉,让 Gatekeeper 不再对它做检查。

打开终端,输入 xattr -cr ,然后将应用程序拖入到终端中, 如下,回车后重新打开 app 运行

拖拽是为了让终端自动填入正确的路径,避免手打时空格、中文之类的转义问题出错。注意 xattr -cr 后面要留一个空格再拖:

xattr -cr /Users/yourname/Downloads/chrome-mac/Chromium.app

拆解一下参数。xattr 是操作文件扩展属性的命令,-c(clear)清除所有扩展属性,-r(recursive)递归处理目录下所有文件——.app 本质是个目录,里面每个文件都可能带标记,所以必须加 -r。

更精准的写法是只删 quarantine 这一个属性,不动其他扩展属性:

xattr -dr com.apple.quarantine /path/to/App.app

-d 是删除指定属性。日常用 -cr 也没问题,.app 包里一般没有其他重要的扩展属性。

想先确认到底有没有这个标记,用 xattr -l 看一下:

xattr -l /path/to/App.app

输出里有 com.apple.quarantine 就说明是这个问题,没有的话得往别的方向排查(比如架构不匹配、依赖缺失)。

清了标记还打不开:重新签名

有的 App 清完 quarantine 依然报「已损坏」,多半是签名本身就是坏的。比如 Electron 打包的 any-listen,自带的只是 ad-hoc 签名,而且签名不完整。用 codesign 和 spctl 一查就能看出来:

codesign -dv /Applications/any-listen.app
# Signature=adhoc

spctl -a -vv /Applications/any-listen.app
# code has no resources but signature indicates they must be present

这种情况在本机给它重新做一次 ad-hoc 签名就行:

xattr -cr /Applications/any-listen.app
codesign --force --deep --sign - /Applications/any-listen.app
codesign --verify --deep /Applications/any-listen.app && echo OK

--sign - 表示 ad-hoc 签名,不需要开发者证书;--deep 会把包里的 Framework、Helper 一起重签。

经常遇到的话,在 ~/.zprofile 里加个函数,以后一条命令搞定:

# 解除 macOS「已损坏」拦截:清除隔离标记并重新签名
unq() { xattr -cr "$1" && codesign --force --deep --sign - "$1"; }

用法:unq /Applications/xxx.app。App 每次升级覆盖安装后,隔离标记和原签名都会回来,到时候再跑一遍即可。

一劳永逸:允许任何来源

不想每个 App 都处理一遍的话,可以直接关掉 Gatekeeper:

sudo spctl --master-disable

在新版 macOS(Sequoia 及之后)上,光执行这条命令还不够。还得打开「系统设置 → 隐私与安全性 → 安全性」,把「允许以下来源的应用程序」手动改成 任何来源:

系统设置隐私与安全性中,允许以下来源的应用程序设为任何来源

改完之后,新下载的 App 不再弹「已损坏」。想恢复默认保护:

sudo spctl --master-enable

这是全局开关,等于对所有来源的软件都放弃了签名和公证检查,包括恶意软件。只装可信来源的话问题不大;平时下载来路比较杂,还是用上面的 unq 逐个放行更稳妥。

另外,网上流传的 defaults write com.apple.LaunchServices LSQuarantine -bool NO 在新版 macOS 上已经无效,不用试。

需要注意的风险

这条命令等于手动跳过了系统的安全检查,所以只对你信任来源的软件用。从官方仓库、知名开源项目下的构建产物可以放心处理;来路不明的破解版、第三方下载站的东西,绕过校验就是把自己暴露在风险里了。清掉标记之后系统不会再有任何提示,一切后果自己承担。

另外别对整个 /Applications 递归执行 xattr -cr。虽然多数情况没事,但那等于把所有应用的扩展属性一起清了,范围太大不可控。按需处理单个 App 就够。

💬留言板0

还没有留言,来发表第一条吧~

PAGE LOAD / LIVEMac 软件提示已损坏无法打开的解决方法 xattr加载中