如何通过编程方式列出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
相关产品推荐
相关产品推荐

