OS X El Capitan中的“restricted”文件夹/文件

73
在将操作系统从OS X Yosemite升级到OS X El Capitan开发预览版后,我尝试编辑/System/Library/LaunchDaemons/ssh.plist以将默认SSH端口更改为自定义端口。这是我使用了几年的过程。
问题在于El Capitan不允许我更改此文件夹中的任何内容(即使使用“sudo”也不行)。当我使用“ls -lO”列出内容时,该文件夹及其文件被标记为"restricted"。同一文件夹在早期版本的OS X中不显示“restricted”。
这是OS X El Capitan的新功能吗?我如何编辑"restricted"的文件/文件夹?
我发现这是由El Capitan引入的名为"SIP"(系统完整性保护)的新功能导致的。
在此处阅读更多信息:https://forums.developer.apple.com/thread/4731?q=SIP 不幸的是,没有人建议一种在不禁用SIP的情况下编辑“restricted”文件/文件夹的方法。

2
没有El Capitan Beta版本。苹果已经发布了操作系统的开发者预览版,如果有问题,请将问题反馈到苹果论坛 - TheDarkKnight
1
@TheDarkKnight,是的,我知道并已经在苹果论坛上发布了这个问题。 - Spencer Müller Diniz
7个回答

78

您也可以通过以下方式临时禁用SIP:

  1. 重新启动
  2. 在灰色屏幕上听到“Mac声音”后,按Cmd+R进入恢复模式
  3. 打开“实用工具”>“终端”
  4. 运行命令csrutil disable
  5. 重新启动,您将会进入已禁用SIP的正常操作系统
  6. 执行所有想要进行的更改操作
  7. 再次重新启动
  8. 在灰色屏幕上听到“Mac声音”后,按Cmd+R进入恢复模式
  9. 使用csrutil enable启用SIP
  10. 再次重新启动
  11. 完成

对我有用 - 我必须chmod u+s /usr/sbin/pppd,才能让SonicWall NetExtender在El-Capitan上重新开始工作,上面的说明使这成为可能。 - Capt. Crunch
1
@Johannes Weiß 是否有可能在卷上禁用SIP以针对特定文件夹? - Ashutosh Dave
在我的电脑上,垃圾桶里有一个“受限制的文件”,但它对我起作用了。 - Bisca

27

直到10.11版本解除了在/System/Library某些文件的保护,或者允许您自己去做这件事之前,唯一不禁用SIP的方法是将该文件复制到其他位置创建一个不同的服务,如:

sudo cp /System/Library/LaunchDaemons/ssh.plist /Library/LaunchDaemons/ssh.plist

那么,您可以自己管理服务,而不是在“系统偏好设置”中使用共享面板:

sudo launchctl unload /Library/LaunchDaemons/ssh.plist
sudo launchctl load -w /Library/LaunchDaemons/ssh.plist

1
请确保更改文件名和文件中的 Label 键,以避免与原始的 launchd 项冲突。 - Gordon Davisson
我认为这是最好的答案。你可能需要编辑并添加一个提醒,即在它真正开始工作之前,你需要重新启动或者使用 sudo launchctl start com.openssh.sshd(或者你给出的任何 Label)。 - n8henrie
帮助处理 org.apache.httpd.plist。在我看来,这是一个很好的建议,应该被接受为更“正确”的方式。 - lifecoder
直到10.11,什么会取消某些文件的保护?这个答案措辞有些奇怪。 - Brad Johnson
@BradleagheJohnson empedocle 的意思是“直到 10.11 的修订取消保护...” - jhfrontz
+1 对于 -w 这个东西。我需要永久禁用一些服务,而不禁用 SIP,使用 -w 卸载解决了这个问题。 - Kaplan Ilya

4

您也可以在禁用文件系统管理的同时保留SIP。进入恢复模式并运行:

csrutil enable --without fs

这将允许您根据需要更改权限。

谢谢。这样做不会破坏这个新功能的安全性吗? - Capt. Crunch
@Amos SIP有许多组件。文件系统保护只是其中之一。是的,禁用它确实会破坏安全性,但仅限于该特定功能,而不是整个SIP。 - grg

4

我建议您尝试将所需的任何参数添加到/Library/Preferences/中的plist文件中。例如,在我的情况下,我需要对mDNSResponder进行轻微修改,以添加AlwaysAppendSearchDomains标志。就像Apple开发者论坛上的"bwells"建议的那样,我只需要执行:

sudo launchctl unload /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
sudo defaults write /Library/Preferences/com.apple.mDNSResponder.plist AlwaysAppendSearchDomains -bool YES
sudo launchctl load /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

这是一种更清晰的方法,可以持久化并且在重启后仍然有效,也应该可以在升级时保留(至少在测试版中,我在关闭SIP后手动更改的内容被覆盖了)。需要注意的是,据我所知这个功能是El Capitan中新增的。


1
这是相关的主题讨论:https://forums.developer.apple.com/thread/17944。似乎无法使用自定义SSH端口,例如 sudo defaults write /Library/Preferences/ssh.plist SockServiceName -string $PORT - n8henrie

2
  1. 只需在重新启动时按下“CMD + R”进入“恢复”模式。
  2. 打开终端
  3. 您的磁盘将被挂载在/Volumes/Macintosh HD中
  4. 通过“rm”删除文件:您在该终端中拥有绝对控制权。

我只在/Volumes/目录下看到对/的符号链接。如何挂载活动系统?已接受答案的步骤确实有效,但我下次还是很好奇。 - Vampire
在打开终端之前,您需要在恢复模式下挂载卷。或者,您可以从终端使用“diskutil mountDisk <device>”。 - user2892047
如果您不想学习“diskutil”命令行,可以在恢复模式下使用“磁盘工具”图形界面来挂载您的(加密)硬盘。 - MarcH

1
我使用碳复制克隆工具进行可克隆备份...并且有几个在轮换中。
根据Bombich的Mike所说,“SIP仅适用于您当前引导的卷,因此[可以]从备份卷引导以删除[文件]”。
我确实使用了Johannes的答案(恢复驱动器,csrutil启用/禁用),但这需要重新启动->恢复驱动器->关闭sip->重新启动->删除垃圾->重新启动->恢复驱动器->打开sip->重新启动...四次重新启动。
但是,从克隆中引导并将原始驱动器作为辅助驱动器查看将允许您在两次重新启动中删除问题文件...是吗?

-1

您可以通过使用Finder应用程序修改文件的权限来“绕过”SIP保护,以便让系统组访问。

修改权限

即使在重新启动后,这对我也很有效,我正在运行:

产品名称:Mac OS X 产品版本:10.11 构建版本:15A284


我无法让它工作-我像你展示的一样拥有System的R+W权限,而且我是管理员,但我仍然无法使用sudo vim(权限不足)或在Finder中添加写入权限。我认为System权限不足以允许用户(甚至root)写入此文件。 - n8henrie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接