<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Xattr on Tuan's Blog</title><link>https://blog.cloudorz.com/tags/xattr/</link><description>Recent content in Xattr on Tuan's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>mt</copyright><lastBuildDate>Sun, 01 Nov 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://blog.cloudorz.com/tags/xattr/index.xml" rel="self" type="application/rss+xml"/><item><title>解决 macOS 提示下载的文件已损坏，打不开的问题</title><link>https://blog.cloudorz.com/p/deal-with-macos-application-permission-problem-when-open-it/</link><pubDate>Fri, 03 Nov 2023 16:20:39 +0800</pubDate><guid>https://blog.cloudorz.com/p/deal-with-macos-application-permission-problem-when-open-it/</guid><description>&lt;img src="https://blog.cloudorz.com/p/deal-with-macos-application-permission-problem-when-open-it/cover.svg" alt="Featured image of post 解决 macOS 提示下载的文件已损坏，打不开的问题" /&gt;&lt;h2 id="起因"&gt;起因&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;macOS&lt;/code&gt; 上最常见的装软件方法就是下载 &lt;code&gt;xxx.dmg&lt;/code&gt; 文件，双击挂载镜像 → 拖进 Applications 的快捷方式 → 在 Dock / 启动台找到装好的软件，&lt;del&gt;原神&lt;/del&gt;，启动！开箱即用，舒服得很。&lt;/p&gt;&#10;&lt;p&gt;但是打开时却提示：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;“xxx”已损坏，无法打开。你应该将它移到废纸篓。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="解决方案"&gt;解决方案&#10;&lt;/h2&gt;&lt;p&gt;打开终端，输入：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xattr -cr /Applications/xxx.app&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;回车，再打开软件，问题解决。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;-c&lt;/code&gt;：清除文件的所有扩展属性（extended attributes）；&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-r&lt;/code&gt;：递归处理，&lt;code&gt;.app&lt;/code&gt; 本质上是一个目录，里面的文件都要处理到。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;如果只想精确地去掉隔离标记、保留其他扩展属性，可以只删 &lt;code&gt;com.apple.quarantine&lt;/code&gt; 这一项：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xattr -dr com.apple.quarantine /Applications/xxx.app&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;小技巧：在终端里输入 &lt;code&gt;xattr -cr &lt;/code&gt; （末尾带一个空格），然后把 App 图标直接拖进终端窗口，路径会自动补全，带空格的名字也不用手动转义。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="问题原因"&gt;问题原因&#10;&lt;/h2&gt;&lt;h3 id="quarantine-隔离属性"&gt;quarantine 隔离属性&#10;&lt;/h3&gt;&lt;p&gt;通过浏览器、聊天软件、AirDrop 等途径下载的文件，系统会自动给它打上一个名为 &lt;code&gt;com.apple.quarantine&lt;/code&gt; 的扩展属性，也就是“隔离标记”。它记录了这个文件是从哪里、被哪个程序下载的。从 dmg 里拖出来的 App 也会继承这个标记。&lt;/p&gt;&#10;&lt;p&gt;可以用 &lt;code&gt;xattr -l&lt;/code&gt; 查看：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xattr -l /Applications/xxx.app&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="gatekeeper-检查"&gt;Gatekeeper 检查&#10;&lt;/h3&gt;&lt;p&gt;带隔离标记的 App &lt;strong&gt;第一次打开&lt;/strong&gt;时，Gatekeeper 会检查它的代码签名和公证（notarization）情况：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;签名有效且经过 Apple 公证：放行；&lt;/li&gt;&#10;&lt;li&gt;未签名、签名失效（例如 App 被修改过、重新打包过），或者在 Apple Silicon 上签名不完整：直接拦截，并给出“已损坏”这种很吓人的提示。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;所以这里的“已损坏”大多数时候并不是文件真的坏了，而是没通过 Gatekeeper 检查。去掉 &lt;code&gt;quarantine&lt;/code&gt; 属性后，系统就不再认为它是“刚下载的文件”，也就不会触发这次检查了。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Gatekeeper 与 quarantine 的关系" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.cloudorz.com/p/deal-with-macos-application-permission-problem-when-open-it/principle.svg"&gt;&lt;/p&gt;&#10;&lt;p&gt;执行前后对比一下，隔离标记确实没了：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="终端验证" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.cloudorz.com/p/deal-with-macos-application-permission-problem-when-open-it/xattr-terminal.svg"&gt;&lt;/p&gt;&#10;&lt;h2 id="可能遇到的情况"&gt;可能遇到的情况&#10;&lt;/h2&gt;&lt;h3 id="提示-permission-denied-或-operation-not-permitted"&gt;提示 Permission denied 或 Operation not permitted&#10;&lt;/h3&gt;&lt;p&gt;App 归属于 root 或者其他用户（比如用安装包 &lt;code&gt;.pkg&lt;/code&gt; 装的），当前用户没有权限修改，需要加 &lt;code&gt;sudo&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo xattr -cr /Applications/xxx.app&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;如果加了 &lt;code&gt;sudo&lt;/code&gt; 仍然提示 &lt;code&gt;Operation not permitted&lt;/code&gt;，通常是终端本身没有权限修改其他 App：到 &lt;strong&gt;系统设置 → 隐私与安全性 → App 管理&lt;/strong&gt;（或 &lt;strong&gt;完全磁盘访问权限&lt;/strong&gt;）里给“终端”授权，然后重开终端再试。&lt;/p&gt;&#10;&lt;h3 id="提示无法验证开发者"&gt;提示“无法验证开发者”&#10;&lt;/h3&gt;&lt;p&gt;这和“已损坏”不是同一个提示，说明 App 有签名但没有经过公证。可以到 &lt;strong&gt;系统设置 → 隐私与安全性&lt;/strong&gt;，在页面下方找到被拦截的 App，点 &lt;strong&gt;仍要打开&lt;/strong&gt;。当然，用上面的 &lt;code&gt;xattr&lt;/code&gt; 命令同样能解决。&lt;/p&gt;&#10;&lt;h2 id="注意事项"&gt;注意事项&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;只对&lt;strong&gt;确认来源可信&lt;/strong&gt;的软件这么做。Gatekeeper 本来就是为了拦截被篡改的、来路不明的程序，去掉隔离标记等于主动跳过这层保护。&lt;/li&gt;&#10;&lt;li&gt;每个新下载的 App 都会重新带上隔离标记，下载新版本后如果又报错，再执行一次即可。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="参考"&gt;参考&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://support.apple.com/zh-cn/102445" target="_blank" rel="noopener"&#10; &gt;Apple 支持：在 Mac 上安全地打开 App&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://support.apple.com/zh-cn/guide/security/sec5599b66df/web" target="_blank" rel="noopener"&#10; &gt;Apple 平台安全：Gatekeeper 和运行时保护&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>