2011-05-05 3 views
1

J'apprends comment utiliser l'objet python dns. Une question rapide comme je vois beaucoup d'exemples montrent des méthodes d'utilisation de la méthode dns.resolver avec le type d'enregistrement DNS (CNAME, NS, etc). Est-il possible d'utiliser cet objet DNS pour interroger un nom DNS et tirer sa résolution avec le type d'enregistrement. Semblable à ce que DIG fournit dans la section des réponses.python dns.resolver obtenir le type d'enregistrement DNS

Merci,

Jim

+0

J'ai foiré autour avec le rdtype et rdclass mais tous les tests que je fais retourne un un type d'enregistrement, même si quand je le compare au Dig ce n'est pas un disque A. – Jim

Répondre

0

On dirait que vous avez besoin de rouler votre propre classe résolveur. Les objets Réponse renvoyés en appelant dns.resolver.query contiennent uniquement les enregistrements qui correspondent spécifiquement à la requête, qui se trouve être un enregistrement A par défaut. Tout est là, le sentier est perdu en cours de route. Si vous imprimez la réponse, vous pouvez voir ce que je veux dire.

#!/usr/bin/env python 

import dns.resolver 

answer = dns.resolver.query('www.clarkmania.com') 
print answer.response 
print "------" 
print answer.rrset 
1

Que pensez-vous de cela?

In [1]: import dns.resolver 

In [2]: dns.resolver.query('chipy.org').__dict__ 
Out[2]: 
{'canonical_name': <DNS name chipy.org.>, 
'expiration': 1304632023.2383349, 
'qname': <DNS name chipy.org.>, 
'rdclass': 1, 
'rdtype': 1, 
'response': <DNS message, ID 64039>, 
'rrset': <DNS chipy.org. IN A RRset>} 
2

Voici un exemple d'un CNAME:

>>> cname = dns.resolver.query("mail.unixy.net", 'CNAME') 
>>> for i in cname.response.answer: 
...  for j in i.items: 
...    print j.to_text() 
... 
unixy.net. 

TXT:

>>> txt = dns.resolver.query("unixy.net", 'TXT') 
>>> for i in txt.response.answer: 
...  for j in i.items: 
...    print j.to_text() 
... 
"v=spf1 ip4:..." 

NS:

>>> ns = dns.resolver.query("unixy.net", 'NS') 
>>> for i in ns.response.answer: 
...  for j in i.items: 
...    print j.to_text() 
... 
ns2.unixy.net. 
ns1.unixy.net. 

Vous pouvez obtenir la plupart des enregistrements suivant le même modèle. Les requêtes à réponses multiples sont stockées dans une liste. Donc, une boucle est parfois nécessaire (ex: multiples recs A et NS).

1

La seule vérification que j'ai trouvée jusqu'ici pour déterminer si la réponse est A ou CNAME est de tester si l'attribut qname est égal à l'attribut canonical_name.

answer = dns.resolver.query('www.example.com') 
if answer.qname == answer.canonical_name: 
    print "This is A record" 
else: 
    print "This isn't A, probably CNAME..." 
1

Vous pouvez obtenir le type avec rdatatype

>>> import dns.resolver 
>>> answer = dns.resolver.query('google.com') 
>>> rdt = dns.rdatatype.to_text(answer.rdtype) 
>>> print(rdt) 
A 
Questions connexes