You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程方式列出macOS系统中的虚拟网络服务

所需前提

使用 scutil 命令可以获取包括虚拟接口(例如VPN)在内的所有网络服务列表:

scutil
> list

输出结果如下:

...
subKey [82] = State:/Network/Service/3EEEA1D1-D35B-427E-BDE0-2025141B495C
subKey [83] = State:/Network/Service/3EEEA1D1-D35B-427E-BDE0-2025141B495C/IPv6
subKey [84] = State:/Network/Service/7B9ECA06-5F37-474A-88A9-CC4EE3638A0E/DHCP
subKey [85] = State:/Network/Service/7B9ECA06-5F37-474A-88A9-CC4EE3638A0E/DNS
subKey [86] = State:/Network/Service/7B9ECA06-5F37-474A-88A9-CC4EE3638A0E/IPv4
subKey [87] = State:/Network/Service/D987D3B3-5AF0-43C8-937E-86B0F8B9D59A
subKey [88] = State:/Network/Service/D987D3B3-5AF0-43C8-937E-86B0F8B9D59A/IPv6
subKey [89] = State:/Network/Service/com.sparklabs.Viscosity.utun10/DNS
subKey [90] = State:/Network/Service/com.sparklabs.Viscosity.utun10/IPv4
subKey [91] = State:/Network/Service/com.sparklabs.Viscosity.utun10/IPv6

可以看到第82-88条对应物理接口的服务,第89-91条是对应OpenVPN类型VPN的虚拟接口(UTUN)服务,我需要获取com.sparklabs.Viscosity.utun10这类服务名称。

获取网络服务

无法获取虚拟接口对应的服务
我可以通过以下代码列出所有物理接口的网络服务:

auto prefs = SCPreferencesCreate(nullptr, CFSTR("test"), nullptr);
CFArrayRef services = SCNetworkServiceCopyAll(prefs);
const size_t num = CFArrayGetCount(services);
for (size_t i = 0; i< num; ++i)
{
    NSLog(@"Service: %@", CFArrayGetValueAtIndex(services, i));
}

但返回结果中不包含UTUN对应的服务:

Service: <SCNetworkService 0x7fa2387078b0 [0x7fff84d43cf0]> {id = FDE22A30-76DA-4AE4-963F-FDE4769EAC91, prefs = 0x7fa23840a900}
Service: <SCNetworkService 0x7fa238706430 [0x7fff84d43cf0]> {id = 9EFF9EEA-EE7B-4D85-8DBD-291FA1A80FE5, prefs = 0x7fa23840a900}
Service: <SCNetworkService 0x7fa238706910 [0x7fff84d43cf0]> {id = 3BA8DFA7-C609-4746-A5B5-5A452F6AF44B, prefs = 0x7fa23840a900}
Service: <SCNetworkService 0x7fa238706140 [0x7fff84d43cf0]> {id = 7B9ECA06-5F37-474A-88A9-CC4EE3638A0E, prefs = 0x7fa23840a900}
Service: <SCNetworkService 0x7fa238705de0 [0x7fff84d43cf0]> {id = A14CD980-C388-4A5D-8DE5-493B62D78A60, prefs = 0x7fa23840a900}

获取接口列表

无法获取接口对应的关联服务
包括虚拟接口在内的所有接口可以很容易地通过以下代码获取:

SCDynamicStoreRef ds = SCDynamicStoreCreate(nullptr, CFSTR("test"), nullptr, nullptr);
    
const auto  list = SCDynamicStoreCopyKeyList(ds, CFSTR("State:/Network/Interface"));
const size_t num = CFArrayGetCount(list);
for (size_t i = 0; i< num; ++i)
{
    auto key = static_cast<CFStringRef>(CFArrayGetValueAtIndex(list, i));
    auto value = static_cast<CFDictionaryRef>(SCDynamicStoreCopyValue(ds, key));
    NSLog(@"%@ = %@", key, value);
}

返回结果如下:

State:/Network/Interface = {
    Interfaces =     (
        ...
        en0,
        en1,
        ...
        utun10
    );
}

但我无法获取到这些接口对应的关联网络服务。

问题

如何通过编程方式列出所有虚拟网络服务?

相关问题

  • 如何列出SCDynamicStorage中的所有可用模式?
  • 在Mac OS X上通过编程方式查找DNS服务器设置

内容的提问来源于stack exchange,提问作者Adrian Maire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 14:36:03