MacOS 是否有对应于 Linux 的unshare(2)?
我希望以下两个系统都失败。
#define _GNU_SOURCE
#include <stdlib.h>
#include <sched.h>
int main()
{
#if __linux__
if(0>unshare(CLONE_NEWNET)) return EXIT_FAILURE;
#elif __APPLE__
/*?*/
#endif
//this should fail on either system
if(0!=system("curl www.google.com")) return EXIT_FAILURE;
}
Mac OS X 并没有像 Linux 这样的命名空间,但是如果你想阻止网络,看起来你可以使用
sandbox_init()
来获得类似的效果。有关说明,请参见手册页。有两个内置配置文件似乎支持类似于您描述的用例:
kSBXProfileNoInternet
,其中 TCP/IP 网络被禁止;和kSBXProfileNoNetwork
,禁止所有基于套接字的网络。(虽然后者可能更接近 Linux 网络命名空间在这里所做的事情,但前者可能足以满足您的需求。)请注意,此功能已被记录为deprecated,希望对应用程序进行沙箱处理的人应查看App Sandbox 功能,因此您可能也想查看一下。我不知道 App Sandbox 会使用相同的机制(您从平台运行的代码
#ifdef
),这就是我sandbox_init()
首先建议的原因。