52 votes

Définir un serveur DNS spécifique en utilisant dns.resolver (pythondns)

J'utilise dns.resolver de dnspython .

Est-il possible de définir l'adresse IP du serveur à utiliser pour les requêtes ?

0 votes

Pouvez-vous ajouter un lien vers la bibliothèque qui fournit dns.resolver ? Par ailleurs, cela ne serait-il pas dans la dns.resolver docs ?

0 votes

@WoLpH Dans ubunty, il y a un paquet nommé python-dnspython

107voto

Marcin Wyszynski Points 531

Bien qu'il s'agisse d'un vieux sujet, je me permets d'intervenir. J'ai rencontré le même problème et j'ai pensé partager la solution. En fait, le fichier de configuration devrait remplir la variable d'instance 'nameservers' du résolveur dns.resolver.Resolver que vous utilisez. Ainsi, si vous voulez contraindre votre Resolver à utiliser un serveur de noms particulier, vous pouvez le faire directement comme ceci :

import dns.resolver

my_resolver = dns.resolver.Resolver()

# 8.8.8.8 is Google's public DNS server
my_resolver.nameservers = ['8.8.8.8']

answer = my_resolver.query('google.com')

J'espère que quelqu'un le trouvera utile.

5 votes

Vous pouvez passer configure=False pour éviter de lire /etc/resolv.conf ou le registre Windows.

0 votes

Vous pouvez consulter leur dépôt git et changer manuellement la branche en python3 .

12 votes

Au cas où quelqu'un tomberait sur cette réponse (comme moi), dnspython supporte désormais Python 3.x (et 2.x si vous l'utilisez encore).

11voto

maxschlepzig Points 3578

Oui, c'est le cas.

Si vous utilisez la fonction de commodité dns.resolver.query() comme ceci

import dns.resolver
r = dns.resolver.query('example.org', 'a')

vous pouvez réinitialiser le résolveur par défaut de telle sorte qu'un serveur de noms spécifique (ou une liste) soit utilisé, par exemple :

import dns.resolver
dns.resolver.default_resolver = dns.resolver.Resolver(configure=False)
dns.resolver.default_resolver.nameservers = ['8.8.8.8', '2001:4860:4860::8888',
                                             '8.8.4.4', '2001:4860:4860::8844' ]
r = dns.resolver.query('example.org', 'a')

Vous pouvez également utiliser un objet résolveur distinct pour certaines requêtes :

import dns.resolver
res = dns.resolver.Resolver(configure=False)
res.nameservers = [ '8.8.8.8', '2001:4860:4860::8888',
                    '8.8.4.4', '2001:4860:4860::8844' ]
r = res.query('example.org', 'a')

9voto

Amal Murali Points 37729

Comme il n'y a pas d'exemple de comment faire cela avec dnspython en 2021, j'ai pensé en poster un :

import dns.resolver

resolver = dns.resolver.Resolver()
resolver.nameservers = ['8.8.8.8'] # using google DNS
result = resolver.resolve('google.com', 'NS')
nameservers = [ns.to_text() for ns in result]

Sortie :

['ns1.google.com.', 'ns3.google.com.', 'ns2.google.com.', 'ns4.google.com.']

1 votes

AttributeError: 'Resolver' object has no attribute 'resolve' en utilisant la dernière version de dnspython .

0 votes

@e-info128 : Assurez-vous que vous utilisez dnspython 2.0.0 ou plus. Voir la documentation .

0 votes

Oui, dnspython==2.1.0 de pip3 . Je résous le problème en utilisant le même exemple mais en remplaçant .resolve() par .query() .

1voto

bstpierre Points 12616

Vous ne le précisez pas dans votre question, mais en supposant que vous utilisiez le résolveur de dnspython.org , la documentation indique que vous devez définir le nameservers sur l'objet Resolver.

Bien qu'il puisse être plus facile de fournir un fichier de type /etc/resolv.conf à transmettre à la fonction du constructeur filename argument .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X