I want to display the DNS servers that are used by the current network setup on OS X, from the command line.
3 Answers
There are several ways - here are two:
cat /etc/resolv.conf
-or-
scutil --dns
-
1Its extremely annoying that
networksetup -getdnsservers
doesn't work for DHCP-assigned DNS servers. I always forget aboutscutil
. The 'sc' stands for System Configuration? It sure doesn't configure much of the system... Sep 10, 2016 at 5:46 -
3It's also good to note that
dig
ornslookup
don't necessarily give a realistic picture of how the macOS applications resolve domain names from the local system, especially when multiple (domain-specific) DNSes have been configured, such as when using a VPN client for multiple concurrent connections. Instead ofnslookup
ordig
, usedscacheutil -q host -a name somehostname.com
to test DNS resolution. It takes into account all configured DNS servers as well as their priority order.– VilleAug 9, 2017 at 21:08 -
6
cat /etc/resolv.conf
doesn't seem like a "reliable" solution anymore. This is the notice I get in macOS High Sierra when using it: (sorry for the formatting - comments don't support simple line breaks) # macOS Notice # # This file is not consulted for DNS hostname resolution, address # resolution, or the DNS query routing mechanism used by most # processes on this system. # # To view the DNS configuration used by this system, use: # scutil --dns– PatrikNApr 4, 2018 at 8:43 -
1I like
scutil --dns | grep nameserver
to just get the DNS servers. Jun 26, 2019 at 0:16
The following shell command can be useful to list the current DNS entries:
grep nameserver <(scutil --dns)
To filter it out for the script, you can pipe the output into awk '{print $3}'
or grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"
command.
-
9This is the same as
scutil --dns | grep nameserver
correct (just different syntax)? Jun 26, 2019 at 0:18 -
1
-
Technically this is process substitution, where the
<(...)
creates a FIFO that can (often) be used in place of a file name. In this case,grep
can either read from stdin or a file, so either technique works, but they are not synonyms. Jan 26 at 1:58
To get all into a comma separated line:
scutil --dns | sed -n '/nameserver/ { s/^.* : \(.*\)/\1/p; }' | sort -u | paste -s -d',' -
-
-
Which complex regex? I would differ that dots and starts are a complex regex... in any case this returns the IPs separated by commas, grep cannot extract those values, it just select lines. Or am I missing something?– estaniJul 26, 2022 at 10:16
-
Any regex including \ is complex to me and I suspect most programmers. ANyway it is more complex in this case than grep. The OP only wants to display the IPs so why go more complex– mmmmmmJul 26, 2022 at 10:42
-
ok. '\' is an escape sequence, not part of the regex, but part of
sed
. The title of my answer already states what this does, which is what I needed (and anyone doing anything with the IP afterwards within the same shell). I'm sorry you don't like that I shared.– estaniJul 26, 2022 at 13:00 -
that is my point to enter a regex you need to escape characters. How can you enter in a script just the regex. You can't separate the two you can only deal with the presentation on the screen. Even then it is just odd characters– mmmmmmJul 26, 2022 at 19:27