MacOS容器的缺陷和默认设置

2020-09-24 10:36:50

本文是Dan Moren的文章“在Big Sur和Catalina上启用Safari14中的调试菜单”的后续文章。在过去,您可以在终端应用程序中使用命令default write com.apple.Safari IncludeInternalDebugMenu-bool true在Safari中启用隐藏的Debug菜单。然而,Dan发现这对他不再起作用,为了启用Debug菜单,他被迫手动编辑PLIST文件。那么这里发生了什么事?这是我的博客文章将要回答的问题。

Dan正确地指出,Safari的首选项文件已经从~/Library/Preferences/com.apple.Safari.plist移到了Safari容器中的~/Library/Containers/com.apple.Safari/Data/Library/Preferences/com.apple.Safari.plist,。丹没有意识到的是,这和Safari 14没有关系。实际上这已经发生了很久了,我相信是在去年Safari 13的时候。Safari 13第一次被沙盒包住了。如果您在终端中执行CoDesign--Display--Entiments-/Applications/Safari.app,您将看到沙盒应用的指示器:

Safari 12和更早版本没有沙箱,Safari首选项始终存储在首选项文件的传统位置,即~/Library/Preferences文件夹。然而,沙盒应用程序只能有限地访问Mac上的文件系统。例如,沙盒应用程序不能读取或写入~/Library/Preferences文件夹。这就是为什么每个沙盒应用程序都有自己的特殊容器来存储它需要的文件。对于Safari,它是~/Library/Containers/com.apple.Safari文件夹。因此,Safari首选项文件的位置必须在Safari 13中移动。问题是,如果您在Mac上运行过Safari 12或更早版本,旧的~/Library/Preferences/com.apple.Safari.plist文件会被遗留!

除了沙箱,在这个场景中还有另一个因素在起作用:系统完整性保护,也就是SIP。Mac上的某些文件和文件夹受系统保护,没有特殊权限就无法访问,即使是非沙盒应用程序也无法访问。原来Safari的容器就是其中一个受保护的文件夹。默认情况下,Finder拥有访问整个文件系统的特殊权限,但终端APP默认没有特殊权限。因此,如果您尝试列出Safari容器中的内容,您就不能。

如果要向终端授予特殊权限,则必须打开系统首选项、安全和隐私窗格、隐私选项卡,在列表中选择完全磁盘访问权限,使用管理员密码解锁,添加终端,如果终端已在运行,则重新启动终端。(最后一步至关重要。)。现在您可以访问Safari的容器了。

这对缺省命令行工具有什么影响?如果终端应用程序具有完全磁盘访问权限,则默认写入com.apple.Safari足够智能,可以使用Safari容器中的首选项文件。但是,如果终端没有完全的磁盘访问权限,则默认值将回退到~/Library/Preferences文件夹中的首选项!因此,如果在没有完全磁盘访问的情况下默认写入com.apple.Safari IncludeInternalDebugMenu-bool true,它将写入~/Library/Preferences/com.apple.Safari.plist,但这没有任何效果,因为Safari是沙箱的,并且只从它自己的容器中读取首选项。请注意,即使~/Library/Preferences/com.apple.Safari.plist中没有旧文件,也会发生这种情况,因为默认设置将在必要时创建新文件。

$DEFAULTS读取com.apple.Safarie.Safari2020-09-22 08:17:23.053默认值[1782:31894]域com.apple.Safari不存在$DEFAULTS写入com.apple.Safari IncludeInternalDebugMenu-bool true$Defaults Read com.apple.Safari{IncludeInternalDebugMenu=1;}。

这个故事有三个寓意,第一,如果你想让默认写入在Safari上正常工作,你需要给终端提供完全的磁盘访问权限。其次,如果您想避免混淆,请确保删除旧的~/Library/Preferences/com.apple.Safari.plist文件,因为Safari不再使用它,但默认情况下可能会使用它,这会带来很多乐趣。例如,默认值为com.apple.Safari IncludeInternalDebugMenu可能会显示错误的值。如果您想了解这是如何发生的,请比较默认设置为com.apple.Safari NewestLaunchedSafariVersion在具有和没有完全磁盘访问的情况下的结果。他们是不同的!

这个故事的第三个也是最后一个寓意是,SIP和沙盒很可怕,应该废除。