Changer le serveur DNS depuis le terminal (ou script) sur Mac OS X

29

Comment puis-je changer mon serveur DNS depuis le terminal sur Mac OS X? [J'en ai besoin car mon DNS ne fonctionne pas correctement avec mon VPN. Parfois, il utilise le DNS pour ma connexion principale, et parfois il utilise le DNS spécifié pour le VPN (ce qu'il devrait).]

Dan Rosenstark
la source

Réponses:

15

Vous pouvez utiliser de manière scutilinteractive à partir du terminal. Exécutez sudo scutilet exécutez ces commandes, en échangeant vos serveurs DNS le cas échéant:

> ouvert
> d.init
> d.add ServerAddresses * 8.8.8.8 9.9.9.9
> définir l'état: / Réseau / Service / PRIMARY_SERVICE_ID / DNS
> quitter

Au lieu d'utiliser 8.8.8.8et d' 9.9.9.9utiliser vos serveurs DNS.

Le seul problème est que ce n'est pas persistant à travers les redémarrages . Si vous voulez des changements permanents, vous aurez besoin de ncutil . La raison pour laquelle la modification /etc/resolv.confn'est pas suffisante dans les versions plus récentes d'OS X est que configd utilise désormais une base de données pour stocker des informations sur les paramètres actuels, que d'autres applications lisent. Certaines applications continueront à lire /etc/resolv.conf (hôte par exemple), bien que ce ne soit pas le cas pour toutes les applications.

John T
la source
2
8.8.8.8 est cependant valide. DNS public de Google. 8.8.4.4 est le secondaire. :-)
Forgotten Semicolon
Je sais, je l'utilise :)
John T
1
Cela devrait. Vous pouvez utiliser scutil --dnspour confirmer.
John T
2
Cela ne semble pas fonctionner sur mon Mac OSX 10.7.5 MBP, du moins pas lorsqu'il est fait littéralement. Dois-je remplacer quelque chose dans la set State:/Network/Service/PRIMARY_SERVICE_ID/DNSligne ou puis-je l'utiliser tel quel? Les nouveaux serveurs DNS devraient-ils apparaître dans la scutil --dnssortie après le changement?
ssc
2
@ssc Exécuter scutilsuivi de > listpour trouver la clé pour remplacer PRIMARY_SERVICE_ID par.
J.Money
46

Vous pouvez utiliser networksetup:

sudo networksetup -setdnsservers <networkservice> DNS1, DNS2, DNS3

par exemple (avoir la connexion à l'aéroport utiliser les serveurs DNS de Google)

sudo networksetup -setdnsservers AirPort 8.8.8.8 8.8.4.4

Vous pouvez trouver le nom du service réseau en exécutant networksetup -listallnetworkservices. Ce sera probablement le «Wi-Fi».

C'est la même chose que si vous deviez modifier les entrées dans le volet Préférences réseau dans les Préférences Système, il est donc persistant lors des redémarrages.

Vous rencontrez peut-être un problème DNS sur Snow Leopard qui se produit lorsque la commande des serveurs DNS est modifiée (voir la question 84144 ))

Chealion
la source
Wow, 84144 est le problème que j'ai. Toujours en train de traiter tout cela ... merci beaucoup!
Dan Rosenstark
6
Une remarque pour quiconque souhaite supprimer le DNS, il suffit d'écrire "vide" (sans les guillemets) au lieu du DNS:sudo networksetup -setdnsservers <networkservice> empty
jackJoe
14

Je n'ai pas assez de points pour répondre au post de Chealion mais pour y ajouter je commencerais par lister les interfaces

networksetup -listallnetworkservices

Une fois que vous avez l'interface que vous souhaitez modifier, vous pouvez faire ce qui suit (j'utilise le Wi-Fi mais vous pouvez faire n'importe quelle autre interface)

sudo networksetup -setdnsservers Wi-Fi empty
sudo networksetup -setdnsservers Wi-Fi 8.8.8.8 8.8.4.4
sudo killall -HUP mDNSResponder

La première ligne de ce qui précède va vider les paramètres DNS puis les suivre avec les serveurs DNS que nous aimerions utiliser et vider finement le cache DNS

Pour vérifier le changement DNS, vous pouvez le faire avant et après ou simplement après

scutil --dns | grep 'nameserver\[[0-9]*\]'
David Kittell
la source
Quiconque est tombé sur cette page. J'ai maintenant un Gist sur GitHub qui devrait aider. gist.github.com/dkittell/34fe7b7422323fba546948b7448933a5
David Kittell
1

resolv.conf ne fonctionne plus sur OSX. Il y a un avis en haut de ce fichier comme suit:

#
# 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
#
# SEE ALSO
#   dns-sd(1), scutil(8)
#
# This file is automatically generated.
#

En outre, networksetup -listallnetworkservicesne répertorie pas toutes les interfaces VPN.

Voici une façon d'utiliser scutil pour cibler la bonne interface: 1. Créez un fichier commands.txtavec vos commandes pour l'outil interactif scutil. par exemple, le contenu de l'interface sécurisée Pulse dans mon cas:

get State:/Network/Service/net.pulsesecure.pulse.nc.main/DNS
d.add ServerAddresses * 8.8.8.8 9.9.9.9
set State:/Network/Service/net.pulsesecure.pulse.nc.main/DNS
  1. Exécutez scutil avec les commandes intégrées. (Vous avez besoin de sudo pour set)
sudo scutil < commands.txt
kikas
la source