85

I want to display the DNS servers that are used by the current network setup on OS X, from the command line.

sorin
  • 29,875
  • Same question: https://superuser.com/questions/258151/how-do-i-check-what-dns-server-im-using-on-mac-os-x – Ricardo May 11 '21 at 23:08

3 Answers3

126

There are several ways - here are two:

cat /etc/resolv.conf

-or-

scutil --dns
Scot
  • 8,045
  • 1
    Its extremely annoying that networksetup -getdnsservers doesn't work for DHCP-assigned DNS servers. I always forget about scutil. The 'sc' stands for System Configuration? It sure doesn't configure much of the system... – Geoff Nixon Sep 10 '16 at 05:46
  • 6
    It's also good to note that dig or nslookup 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 of nslookup or dig, use dscacheutil -q host -a name somehostname.com to test DNS resolution. It takes into account all configured DNS servers as well as their priority order. – Ville Aug 09 '17 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

    – PatrikN Apr 04 '18 at 08:43
  • 1
    I like scutil --dns | grep nameserver to just get the DNS servers. – SamAndrew81 Jun 26 '19 at 00:16
  • /etc/resolv.conf is no more used, but scutil --dns gives to-the-point info. – dvo Nov 05 '23 at 07:09
6

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.

kenorb
  • 12,695
  • 9
    This is the same as scutil --dns | grep nameserver correct (just different syntax)? – SamAndrew81 Jun 26 '19 at 00:18
  • 1
    @SamAndrew81 correct same – slm May 06 '21 at 16:47
  • 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. – shawkinaw Jan 26 '23 at 01:58
  • Also scutil --dns | creates a pipe, so at least w.r.t the result is the same, and I find it more intuitive to use than <(scutil --dns) because the data flow is "from left to right". – dvo Nov 05 '23 at 07:17
0

To get all into a comma separated line:

scutil --dns | sed -n '/nameserver/ { s/^.* : \(.*\)/\1/p; }' | sort -u | paste -s -d',' -
estani
  • 159
  • grep is much simpler why use the complex regexp? – mmmmmm Jul 25 '22 at 10:50
  • 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? – estani Jul 26 '22 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 – mmmmmm Jul 26 '22 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. – estani Jul 26 '22 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 – mmmmmm Jul 26 '22 at 19:27
  • A simpler way to print just the IP addresses is awk -F' : ' '/nameserver/ {print $2}' – shawkinaw Jan 26 '23 at 01:54
  • What i like about the original suggestion is that it removes duplicates (via sort -u). So here is my favorite: scutil --dns | awk -F: '/nameserver/ {print $2}' | sort -u – dvo Nov 05 '23 at 07:27
  • @shawkinaw I guess this will break with ipv6 right? They are separated by colons... but that's not something anyone would care for the next century probably – estani Nov 14 '23 at 09:55
  • @estani That's why you need the spaces in the field separator as I put in my comment (awk -F ' : ' vs. awk -F:), then it still works fine with IPv6. – shawkinaw Nov 16 '23 at 18:53
  • 1
    @shawkinaw I misread the quotes and saw dvo answer, which is omitting them. Very nice! – estani Nov 17 '23 at 21:06