王可可的主页

不止于CRUD

彻底解决Mac安装软件“已损坏,无法打开”问题:从原理到一键脚本

📅 2026-01-23 📂 实用教程 👁️ 60 阅读
← 返回列表
摘要: 当你在 macOS 上安装第三方软件时,是否经常遇到“已损坏,无法打开。您应该将它移到废纸篓”的恼人提示?这并非软件真的损坏,而是 macOS 严格的安全机制在起作用。本文将深入解析这一问题的成因,提供两种有效的解决方案,并分享一个一键化自动处理脚本,让你轻松绕过限制,顺利安装所需应用。
  • 一、问题根源:macOS 的安全机制

    从 macOS Sierra(10.12)开始,苹果进一步加强了系统安全策略,具体表现为:

    1. 默认隐藏“任何来源”选项:在“系统偏好设置 → 安全性与隐私”中,普通用户无法直接看到和选择“任何来源”。
    2. 应用公证(Notarization)要求:未经过苹果公证(Notarize)的第三方应用会被标记为“已损坏”。
    3. 隔离属性(Quarantine):从网络下载的应用会被自动添加 com.apple.quarantine 扩展属性,系统据此进行拦截提示。

    这些机制虽然提升了安全性,但也给安装一些未上架 App Store 的实用工具带来了不便。

    二、解决方案一:重新开启“任何来源”

    这是最根本的解决方法,通过终端命令重新启用被隐藏的选项:
    bash

    sudo spctl --master-disable
    

    执行后效果

    • 终端无需额外输出,命令执行成功即可
    • 再次进入“系统偏好设置 → 安全性与隐私 → 通用”,你会看到“任何来源”选项重新出现并被选中

    如果想恢复默认安全设置(仅允许 App Store 和被认可开发者),可使用:
    bash

    sudo spctl --master-enable
    

    三、解决方案二:移除应用的隔离属性

    如果开启“任何来源”后仍提示损坏,说明该应用被标记了隔离属性,需要手动移除:
    bash

    sudo xattr -r -d com.apple.quarantine /Applications/应用名称.app
    

    操作技巧

    • 输入 sudo xattr -r -d com.apple.quarantine 后加一个空格
    • 直接从“访达”的“应用程序”文件夹中,将应用图标拖拽到终端窗口,路径会自动填充
    • 回车后输入密码即可完成处理

    四、一键自动化脚本:简化所有流程

    为了免去记忆命令和手动操作的麻烦,我们可以使用一个智能化的 Bash 脚本(文章开头已提供完整代码)。该脚本提供四大功能:

    📱 脚本功能菜单

    1. 查看当前系统策略状态 → 了解是否已允许“任何来源”
    2. 开启“任何来源”选项 → 一键执行 sudo spctl --master-disable
    3. 恢复系统默认安全设置 → 一键执行 sudo spctl --master-enable
    4. 免疫指定应用程序 → 可视化选择应用并移除隔离属性

    🛠 脚本优势

    • 交互式操作:清晰的中文提示,避免输入错误
    • 安全可控:在执行修改前会请求确认
    • 状态反馈:每次操作后显示最新的系统安全状态
    • 应用列表:自动列出 /Applications 下的所有应用,支持带空格的应用名

    🚀 使用示例

    当你想对“Parallels Desktop.app”进行免疫处理时:

    1. 运行脚本,输入 4 选择免疫功能
    2. 从列出的应用列表中找到并粘贴应用名称(如 Parallels\ Desktop.app
    3. 输入 Y 确认执行
    4. 脚本自动执行 sudo xattr -r -d com.apple.quarantine /Applications/Parallels\ Desktop.app

    五、重要注意事项

    1. 安全提醒:仅从可信来源下载应用,绕过安全机制会增加系统风险
    2. 系统兼容:本方法适用于 macOS Sierra (10.12) 及以上版本
    3. 权限要求:所有命令需要管理员密码(sudo)
    4. 脚本使用:首次运行脚本可能需要执行 chmod +x 脚本名.command 赋予执行权限

    六、总结

    macOS 的“已损坏”提示本质上是系统在保护你免受潜在恶意软件的侵害。通过理解其背后的安全机制,我们可以有选择地、安全地绕过这些限制,安装那些我们信任却未经过苹果官方渠道分发的应用。
    文中的自动化脚本将整个流程简化到只需几次选择,特别适合不熟悉终端操作的 Mac 用户。建议将脚本保存到方便的位置,未来遇到类似问题时即可快速调用。
    最后提醒:在享受自由安装软件便利的同时,请始终保持对软件来源的警惕,定期更新系统,并配合可靠的安全软件,才能真正做到安全与便利的平衡。

脚本内容,复制如下脚本
然后命名为 《已损坏,移到废纸篓处理脚本.command》 即可愉快的玩耍了

#!/bin/bash
echo "📢📢📢【读在前面】📢📢📢"
echo "当前脚本为了解决Mac安装软件的“已损坏,无法打开  的提示问题"
echo "执行免疫应用前,请先检测你的系统策略控制状态,如果返回了 assessments disabled 则表示你已经放开系统控制权限;"
echo "你可以直接执行 【免疫隔离应用】"
echo "如果结果是assessments enable 则说明现在还不允许 免疫隔离应用"
echo "需要你先执行  【开启允许“任何来源”的选项】 命令后;在执行 【免疫隔离应用】"
echo "------------------------------【分割线】---------------------------------------"
echo "请选择要做的操作"
echo "1.【查看系统策略控制状态】  sudo spctl --status"
echo "2.【开启允许“任何来源”的选项】  sudo spctl  --master-disable"
echo "3.【恢复管理系统策略控制 默认设置 】  sudo spctl  --master-enable"
echo "4.【免疫隔离应用】  sudo xattr -r -d com.apple.quarantine"

#开始处理输入内容
echo "请输入你要做的事情:"
read in_type
echo "输入内容:<<<< $in_type >>>>"
# 判定输入是否正确
if [ "$in_type" -ne 1 ] && [ "$in_type" -ne 2 ] && [ "$in_type" -ne 3 ] && [ "$in_type" -ne 4 ]; then
	echo "⚠️选项不正确⚠你输入的内容是: $in_type️"
else
	echo "输入选项合法✅ 你输入的内容是 $in_type"
fi

#执行【查看系统策略控制状态】脚本
if [ "$in_type" -eq 1 ] ; then
	echo "✅ 你选择的是【查看系统策略控制状态】"
	echo "执行:sudo spctl --status"
cmd="sudo spctl --status"
eval $cmd
fi

#执行【开启允许“任何来源”的选项】命令
if [ "$in_type" -eq 2 ] ; then
	echo "✅ 你选择的是【开启允许“任何来源”的选项】"
	echo "执行:sudo spctl  --master-disable"
	cmd="sudo spctl  --master-disable"
	eval $cmd
	echo "最新状态是:$(sudo spctl --status)"
fi

#执行【恢复管理系统策略控制 默认设置】命令
if [ "$in_type" -eq 3 ] ; then
	echo "✅ 你选择的是【恢复管理系统策略控制 默认设置 】"
	echo "执行:sudo spctl  --master-enable"
	cmd="ls"
	eval $cmd
	echo "最新状态是:$(sudo spctl --status)"
fi

#执行【免疫隔离应用】命令
if [ "$in_type" -eq 4 ] ; then
echo "✅ 你选择的是 【免疫隔离应用】"
echo "💻💻💻💻【输出APP列表】"
	cmd="cd /Applications"
	eval $cmd
	#列出mac APP清单列表 
	cmd="ls -1 | sed 's/ /\\\ /'"
	eval $cmd
	
	#开始执行命令
	echo "请输入选择的APP:注意📢请从输出的APP列表粘贴APP 如:Parallels\ Desktop.app"
	read -r in_app
	echo "您选择的app是:$in_app"
	echo "正在执行 【免疫隔离应用】"
	echo "是否执行脚本Y/N:sudo xattr -r -d com.apple.quarantine /Applications/$in_app"
	read in_select
	echo "输入内容: $in_select"
	if [ "$in_select" == 'Y' ] || [ "$in_select" == 'y' ]; then
		echo "执行【免疫隔离应用】:$in_app"
		cmd="sudo xattr -r -d com.apple.quarantine /Applications/$in_app"
		eval $cmd
	else
		echo "你选择了取消执行或其他选项✅ 你输入的内容是 $in_select"
	fi
fi
echo "脚本执行结束!请打开你的APP看看能否正常打开吧!"