微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从swift调用nettop:“无法分配内核控制套接字”

如何解决从swift调用nettop:“无法分配内核控制套接字”

我正在为命令行 nettop 实用程序编写 macOS GUI 包装器。

当我通过 zsh 从终端应用程序调用 nettop -P -L 1 时,它会显示正确的输出,但是当我从 Swift 应用程序中启动该进程时,它会在我的应用程序中显示以下内容

nettop[19213:2351456] [NetworkStatistics] Unable to allocate a kernel control socket nettop: NStatManagerCreate Failed

这是某种权限还是沙盒问题,如果是,我该如何让我的应用请求适当的权限?

代码片段:

func shell(launchPath: String,arguments: [String] = []) -> (String?,Int32) {
    let task = Process()
    task.launchPath = launchPath
    task.arguments = arguments

    let pipe = Pipe()
    task.standardOutput = pipe
    task.standardError = pipe
    task.launch()
    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output = String(data: data,encoding: .utf8)
    task.waitUntilExit()
    return (output,task.terminationStatus)
}

...


struct ContentView: View {
    var body: some View {
            Text(shell(launchPath: "/usr/bin/nettop",arguments: ["-P","-L","1"]).0 ?? "No Output")
    }
}

解决方法

这确实是一个沙盒问题:nettop 通过创建一个 com.apple.network.statistics PF_SYSTEM/SYSPROTO_CONTROL 套接字(源示例可以在 http://newosxbook.com/code/listings/17-1-lsock.c 中看到)进行操作,该套接字可以被沙盒化。

对这个socket的访问受到两层限制:

  • com.apple.private.network.statistics 权限在 net.statistics_privcheck sysctl 设置为 1 时强制执行。这不是你的情况,因为你正在执行 nettop,它无论如何都有权限

  • 沙箱配置文件阻止创建系统套接字,除非明确允许

     (allow network-outbound
             (control-name "com.apple.network.statistics")
             (control-name "com.apple.netsrc"))
    

规则。

后一种情况似乎就是您的情况,但从您的详细信息来看,尚不清楚问题是出在您自己的应用程序的沙箱配置文件中还是在执行的网络上。要确定这一点,请尝试自己创建套接字 - 如果您可以这样做,那么这是 exec 的问题。如果你不能,那就是你自己的个人资料。您可以创建自己的沙盒配置文件,但这是 Apple 永远不会公开允许的,而且可能会让您被踢出 App Store。

另一个测试 - 直接从命令行运行您的应用。 (即,在终端中,然后是 /Applications/path/to/your.app/Contents/MacOS/yourApp)。这样,它就不会由 xpcproxy 启动,并且会受到更少的沙盒约束。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。