I want to display the DNS servers that are used by the current network setup on OS X, from the command line.
Asked
Active
Viewed 1.6e+01k times
85
-
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 Answers
126
There are several ways - here are two:
cat /etc/resolv.conf
-or-
scutil --dns
Scot
- 8,045
-
1Its extremely annoying that
networksetup -getdnsserversdoesn'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... – Geoff Nixon Sep 10 '16 at 05:46 -
6It's also good to note that
digornslookupdon'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 ofnslookupordig, usedscacheutil -q host -a name somehostname.comto 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.confdoesn'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 -
1I like
scutil --dns | grep nameserverto just get the DNS servers. – SamAndrew81 Jun 26 '19 at 00:16 -
/etc/resolv.confis no more used, butscutil --dnsgives 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
-
9This is the same as
scutil --dns | grep nameservercorrect (just different syntax)? – SamAndrew81 Jun 26 '19 at 00: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,grepcan 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
-
-
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