spctl 是 system policy controller 的缩写,它是 macOS 安全架构中的一个核心命令行工具,它的主要作用是 管理和执行 Apple 的代码签名策略,以确保只有来自可信来源的软件才能在您的 Mac 上运行。

spctl macOS Gatekeeper(网关守护程序)的“幕后指挥官”。
spctl 的核心作用
在深入命令之前,理解它的作用至关重要:
- 执行 Gatekeeper 策略:Gatekeeper 是 macOS 的安全功能,它会检查你尝试运行的 App 是否来自 Mac App Store 或者拥有来自 Apple 的开发者 ID。
spctl就是实现这一检查的底层工具。 - 管理评估策略:
spctl使用“评估策略”来决定一个程序是否可以运行,这些策略定义了什么样的代码签名是可接受的。 - 开发者证书验证:对于非 Mac App Store 的应用,
spctl会验证其开发者签名证书是否有效、是否被吊销。 - 自定义安全策略:系统管理员和高级用户可以使用
spctl来创建自己的安全规则,只允许特定文件夹里的程序运行”。
常见的 spctl 命令及使用场景
以下是 spctl 最常用的一些命令,配有解释和示例。
查看当前状态
这是最常用的命令之一,用于查看 Gatekeeper 和 spctl 的整体配置状态。

spctl --status
可能的输出示例:
-
状态评估(Assessment enabled):
enabled这表示 Gatekeeper 处于开启状态,会检查所有应用程序。
-
策略来源(source):
(图片来源网络,侵删)disabled这表示 Gatekeeper 被完全禁用(不推荐,安全风险高)。
-
更详细的状态:
/System/Library/Security/PolicyBanner.bundle/Contents/MacOS/PolicyBanner assessment enabled runtime scopes are enforced这会显示更详细的信息,包括策略是否被强制执行。
管理开发者 ID
这是 spctl 最强大的功能之一,用于允许或阻止特定开发者签名的应用。
允许特定开发者
当你从某个开发者那里下载了一个应用,第一次打开时可能会被阻止,如果信任这个开发者,可以使用以下命令永久允许他签名的所有应用。
语法:
spctl add <开发者ID>
示例:
假设你要允许著名开发者 Panic 的所有应用,你需要从他们的应用签名证书中找到 Team ID(通常是 10 位字母数字的组合)。
# 添加 Panic 的 Team ID (假设是 ABCDEFG123) sudo spctl add ABCDEFG123
执行后,所有由 ABCDEFG123 这个 Team ID 签名的应用都将被允许运行,无需再在“系统设置”中手动确认。
阻止特定开发者
如果你不再信任某个开发者,或者发现某个开发者签名的应用有问题,可以阻止他。
语法:
spctl remove <开发者ID>
示例:
# 移除之前添加的 Panic Team ID sudo spctl remove ABCDEFG123
列出所有允许的开发者
如果你想查看当前已经信任的所有开发者列表:
spctl list
输出示例:
Panic, Inc. (ABCDEFG123): admited
My Awesome Company (XYZ987654): admited
管理特定应用
允许某个特定应用(即使它被阻止)
如果你确定一个被阻止的应用是安全的,可以只为这个应用创建一个例外。
语法:
spctl add --type <类型> <路径>
示例:
假设你的下载目录中有一个名为 MyCoolApp.app 的应用被阻止了。
# 将 /Users/yourname/Downloads/MyCoolApp.app 添加到允许列表 sudo spctl add --type exec /Users/yourname/Downloads/MyCoolApp.app
这里的 --type exec 表示这是一个可执行文件。
禁用和启用 Gatekeeper
警告: 除非你有特殊需求(如开发测试),否则不建议完全禁用 Gatekeeper。
临时禁用 Gatekeeper
sudo spctl --master-disable
执行后,任何应用都可以运行,系统不再进行代码签名检查,你会看到输出 disabled。
重新启用 Gatekeeper
sudo spctl --master-enable
执行后,Gatekeeper 会恢复到之前的设置,重新开始检查应用,你会看到输出 enabled。
如何获取开发者 ID (Team ID)
在使用 spctl add 时,你需要的是开发者的 Team ID,而不是公司名称,获取方法如下:
- 找到该开发者签名的
.app包。 - 右键点击
.app包,选择 “显示包内容” (Show Package Contents)。 - 在
Contents目录下,找到名为_CodeSignature的文件夹。 - 进入
_CodeSignature文件夹,里面会有一个或多个.xml文件。 - 用文本编辑器打开其中一个
.xml文件(通常是CodeDirectory或CodeResources)。 - 中搜索
TeamIdentifierPrefix,后面的 10 位字母数字字符串就是 Team ID。
更简单的方法是使用命令行:
# 替换 /path/to/your/app.app 为你的应用路径 codesign -d --verbose=4 /path/to/your/app.app
在输出的 Designated => 部分,你会看到类似 identifier "com.panic.Coda" and (certificate leaf[field.1.2.840.113635.100.6.2.6] /* exists */ or certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "ABCDEFG123") 的内容,ABCDEFG123 Team ID。
总结与最佳实践
| 命令 | 作用 | 使用场景 |
|---|---|---|
spctl --status |
查看 Gatekeeper 状态 | 快速检查系统安全策略是否开启。 |
sudo spctl add <TeamID> |
永久允许某个开发者的所有应用 | 信任一个可信赖的开发者,避免每次打开应用时都弹出确认。 |
sudo spctl remove <TeamID> |
永久阻止某个开发者的所有应用 | 不再信任某个开发者,增强安全性。 |
spctl list |
列出所有已信任的开发者 | 管理你的信任列表。 |
sudo spctl add --type exec <path> |
允许单个特定应用 | 为一次性或临时的应用创建例外。 |
sudo spctl --master-disable |
完全禁用 Gatekeeper | 不推荐!仅用于高级调试或开发环境。 |
sudo spctl --master-enable |
重新启用 Gatekeeper | 从禁用状态恢复系统默认安全策略。 |
最佳实践:
- 优先使用 Mac App Store:这是最安全的应用来源。
- 谨慎使用“任何来源”:在“系统设置” >“隐私与安全性” >“安全性”中,尽量选择“App Store 和被认可的开发者”,仅在绝对必要时才选择“任何来源”。
- 信任开发者而非单个应用:如果你经常使用某个开发者(如 Microsoft, Adobe, Oracle)的软件,使用
spctl add他们的 Team ID 是最方便、最安全的方式。 - 从官方渠道下载:始终从开发者官网或受信任的来源下载软件,避免下载被篡改的应用。
spctl是强大的工具:使用sudo时要格外小心,错误的命令可能会影响系统的安全性,在执行不熟悉的命令前,最好先备份或了解其确切作用。
