Change DNS Server From Terminal (or script) on Mac OS X
Solution 1:
You can use scutil
interactively from the terminal. Run sudo scutil
and run these commands, swapping your DNS servers in where appropriate:
> open > d.init > d.add ServerAddresses * 8.8.8.8 9.9.9.9 > set State:/Network/Service/PRIMARY_SERVICE_ID/DNS > quit
Instead of using 8.8.8.8
and 9.9.9.9
use your DNS servers.
The only problem is this is not persistent across reboots. If you want permanent changes, you'll want ncutil. The reason editing /etc/resolv.conf
isn't sufficient in newer versions of OS X is because configd now uses a database to store information of current settings, which other applications read. Certain applications will still read /etc/resolv.conf
(host for example), although that is not the case for all applications.
Solution 2:
You can use networksetup
:
sudo networksetup -setdnsservers <networkservice> DNS1, DNS2, DNS3
eg (having the Airport connection use Google's DNS Servers)
sudo networksetup -setdnsservers AirPort 8.8.8.8 8.8.4.4
You can find out the name of the network service by running networksetup -listallnetworkservices
. It'll be 'Wi-Fi' probably.
This is the same as if you were to edit the entires in the Network Preference Pane in System Preferences, so it is persistent across reboots.
You may be running into a DNS issue on Snow Leopard that occurs when the order DNS servers are queried changes (see question 84144))
Solution 3:
I don't have enough points to reply to Chealion's post but to add on to it I'd start with listing the interfaces
networksetup -listallnetworkservices
Once you have the interface you'd like to change you can do the below (I'm using the Wi-Fi but you can do any other interface)
sudo networksetup -setdnsservers Wi-Fi empty
sudo networksetup -setdnsservers Wi-Fi 8.8.8.8 8.8.4.4
sudo killall -HUP mDNSResponder
The first line of the above will empty out the DNS settings then follow it with the DNS servers we'd like to use and finely clear the DNS cache
To verify the DNS change you can do this before and after or simply after
scutil --dns | grep 'nameserver\[[0-9]*\]'