启用SIP后应适配其规则而非绕过:SIP保护/System等核心路径,但允许~/Library/Preferences、/etc/hosts、/usr/local等位置操作;脚本需用defaults、launchd、Apple官方工具等合规方式实现配置。

在 macOS 中启用系统完整性保护(SIP)后,许多传统脚本操作会因权限限制而失败。关键不是绕过 SIP,而是理解其边界、适配其规则,并采用 Apple 推荐的安全方式完成配置任务。
明确 SIP 的保护范围与例外
SIP 主要限制对以下路径的写入和修改:/System、/usr、/bin、/sbin、/var/root 等核心目录,以及内核扩展、某些进程调试能力等。但 SIP 不阻止用户级配置,例如:
- 修改 ~/Library/Preferences/ 下的 plist 文件(如 com.apple.finder)
- 通过 defaults 命令写入用户域或全局域(需 sudo,且仅限允许的 domain)
- 配置 /etc/hosts(SIP 允许,但需 root 权限)
- 使用 launchd 创建用户级或系统级守护进程(plist 放在对应 LaunchAgents/LaunchDaemons 目录)
注意:/usr/local 是 SIP 豁免目录,可安全用于安装 Homebrew、自定义脚本、二进制文件等。
编写兼容 SIP 的配置脚本要点
脚本应避免硬编码写入受保护路径,转而利用 Apple 提供的接口和约定位置:
部署和使用军舰的 macOS Automator 自动化服务集合。包含 5 个实用工作流:PDF转JPG、PNG重命名并转JPG、图像拼接、解压RAR、顺序命名图像文件。一键安装所有服务到 ~/Library/Services/ 目录。使用场景:(1) "安装我的自动化服务",(2) "部署所有 Automato...
- 用
defaults write替代直接编辑 plist 文件(自动处理权限与格式) - 用
sudo cp或sudo tee向 /etc/ 下非 SIP 保护文件写入(如 /etc/hosts、/etc/shells) - 将自定义启动项保存为 .plist 到 ~/Library/LaunchAgents/(用户级)或 /Library/LaunchDaemons/(需 sudo,且签名推荐)
- 调用 systemsetup、networksetup、dscl 等 Apple 官方命令行工具,而非直接改 /private/var/db/dslocal/
示例:禁用 Time Machine 本地快照(合法且 SIP 兼容)
sudo tmutil disablelocal
执行时的权限策略与安全实践
不要关闭 SIP——这是 macOS 安全基石。正确做法是分场景申请最小必要权限:
- 用户级配置:脚本以当前用户身份运行,仅在必要时用
sudo执行特定命令(如修改 /etc/hosts) - 系统级配置:使用
sudo+ 明确命令,避免sudo bash整体提权(易出错且不审计) - LaunchDaemon 配置:plist 文件需 root 所有、644 权限,且建议用
launchctl bootstrap(macOS 12+)替代旧式launchctl load - 签名与公证:若分发脚本或配套二进制,Apple 要求 macOS 10.15+ 上的 kernel extension 和部分守护进程需已签名并公证
调试与验证技巧
遇到“Operation not permitted”错误时,先确认是否触达 SIP 区域:
- 运行
csrutil status查看 SIP 当前状态(通常为 enabled) - 用
ls -lO /path/to/file检查文件是否标记为restricted - 查看系统日志:
log show --predicate 'eventMessage contains "SIP"' --last 1h - 测试替代路径:比如想改 shell 配置,优先写 ~/.zshrc 而非 /etc/zshrc(后者受 SIP 保护)
不复杂但容易忽略。

















