在Mac OS上是否可以通过编程方式更改DNS?

4
2个回答

7
我最近遇到了同样的问题。我在这里发布了我的解决方案: http://blog.notampering.com/ 以下是代码片段...希望有所帮助。
#include <stdio.h>
#include <SystemConfiguration/SCPreferences.h>
#include <SystemConfiguration/SCDynamicStore.h>


int main (int argc, const char * argv[])
{
    //get current values
    SCDynamicStoreRef dynRef=SCDynamicStoreCreate(kCFAllocatorSystemDefault, CFSTR("iked"), NULL, NULL);
CFDictionaryRef ipv4key = SCDynamicStoreCopyValue(dynRef,CFSTR("State:/Network/Global/IPv4"));
CFStringRef primaryserviceid = CFDictionaryGetValue(ipv4key,CFSTR("PrimaryService"));
CFStringRef primaryservicepath = CFStringCreateWithFormat(NULL,NULL,CFSTR("State:/Network/Service/%@/DNS"),primaryserviceid);
CFDictionaryRef dnskey = SCDynamicStoreCopyValue(dynRef,primaryservicepath);

//create new values
CFMutableDictionaryRef newdnskey = CFDictionaryCreateMutableCopy(NULL,0,dnskey);
CFDictionarySetValue(newdnskey,CFSTR("DomainName"),CFSTR("example.com"));

CFMutableArrayRef dnsserveraddresses = CFArrayCreateMutable(NULL,0,NULL);
CFArrayAppendValue(dnsserveraddresses, CFSTR("8.8.8.8"));
CFArrayAppendValue(dnsserveraddresses, CFSTR("4.2.2.2"));
CFDictionarySetValue(newdnskey, CFSTR("ServerAddresses"), dnsserveraddresses);

//set values
bool success = SCDynamicStoreSetValue(dynRef, primaryservicepath, newdnskey);

//clean up
CFRelease(dynRef);
CFRelease(primaryservicepath);
CFRelease(dnskey);
CFRelease(dnsserveraddresses);
CFRelease(newdnskey);
}

1
这段代码对我来说不起作用 :(。SCDynamicStoreSetValue() 返回 false。 - Omkar
你是否以root权限运行它? - dgatwood
1
是的,必须以root身份运行,并且在我的环境中,我需要在顶部添加:#include <SystemConfiguration/SystemConfiguration.h>才能编译。 - Meir Gerenstadt
对我来说,这行代码:CFDictionaryRef dnskey = SCDynamicStoreCopyValue(dynRef,primaryservicepath); 给出了一个强制转换错误:无法使用类型为“CFPropertyListRef _Nullable”(即“const void *”)的rvalue初始化类型为“CFDictionaryRef”(即“const __CFDictionary *”)的变量。 - Matt Cobb

2

这里有一个关于shell脚本版本的文档:http://osxdaily.com/2015/06/02/change-dns-command-line-mac-os-x/

简单来说:

最初的回答是:

# Template:
networksetup -setdnsservers (Network Service) (DNS IP) (DNS IP) ...

# Example: set DNS for Wi-Fi to 8.8.8.8  8.8.4.4  1.1.1.1
sudo networksetup -setdnsservers Wi-Fi  8.8.8.8  8.8.4.4  1.1.1.1

# Example: Clear the manually assigned DNS so that the default values can take over
sudo networksetup -setdnsservers Wi-Fi  Empty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接