web-dev-qa-db-fra.com

module python pour nslookup

Existe-t-il un module python qui répète les mêmes tâches que nslookup? Je sais que je peux utiliser os.sys pour appeler nslookup, mais je me demande s’il existe déjà un module python pour cela . Merci d’avance!

19
jaysonpryde

J'utilise le code suivant:

import socket

ip_list = []
ais = socket.getaddrinfo("www.yahoo.com",0,0,0,0)
for result in ais:
  ip_list.append(result[-1][0])
ip_list = list(set(ip_list))
16
PajE

Vous devez utiliser DNSPython

import dns.resolver

answers = dns.resolver.query('dnspython.org', 'MX')
for rdata in answers:
    print 'Host', rdata.exchange, 'has preference', rdata.preference
13
Exos

Vous devriez utiliser socket library http://docs.python.org/2/library/socket.html

L'appel de fonction système n'est pas une bonne pratique dans ce cas.

8
Sébastien

le problème est que socket.gethostbyname () ne renvoie qu'une seule adresse IP. nslookup en renvoie autant qu'il a . J'utilise:

import subprocess

process = subprocess.Popen(["nslookup", "www.google.com"], stdout=subprocess.PIPE)
output = process.communicate()[0].split('\n')

ip_arr = []
for data in output:
    if 'Address' in data:
        ip_arr.append(data.replace('Address: ',''))
ip_arr.pop(0)

print ip_arr

il va imprimer:

['54.230.228.101', '54.230.228.6', '54.230.228.37', '54.230.228.80', '54.230.228.41', '54.230.228.114', '54.230.228.54', '54.230.228.23']
5
username

Notez que socket.getfqdn() peut renvoyer le nom complet d'un nom d'hôte. Voir: http://docs.python.org/2/library/socket.html?highlight=socket.getaddrinfo#socket.getfqdn

Par exemple:

python -c  'import socket; print(socket.gethostname()); print(socket.getfqdn());'
myserver
myserver.mydomain.local

Mais le résultat dépend de la configuration /etc/hosts. Si tu as:

$ cat /etc/hosts
127.0.0.1       myserver  localhost.localdomain  localhost

Le résultat de socket.getfqdn() sera:

python -c  'import socket; print(socket.getfqdn());'
localhost.localdomain

Oups! Pour résoudre ce problème, la seule solution que je connaisse consiste à modifier le /etc/hosts comme suit:

$ cat /etc/hosts
127.0.0.1       myserver  myserver.mydomain.local  localhost.localdomain  localhost

J'espère que ça aide!

5
Laurent LAPORTE

Je devais localiser les enregistrements A dans AWS Route 53 à l'aide de CNames. AKA messaging.myCompany.com à moreSpecificMessaging.myCompanyInternal.com

J'utilise aussi Socket, mais une autre méthode plutôt cachée.

import socket

addr1 = socket.gethostbyname_ex('google.com')

print(addr1)

https://docs.python.org/3/library/socket.html#socket.gethostbyname_ex

4
Machindo

Les réponses précédentes sont correctes, mais voici ce que je voudrais utiliser socket , il "donne accès à l’interface de socket BSD. Il est disponible sur tous les systèmes Unix modernes, Windows, MacOS et probablement sur d’autres plateformes."

import socket

distinct_ips = []
# 0,0,0,0  is for (family, type, proto, canonname, sockaddr)
#change some_site.com to whatever your are looking up of course
socket_info = socket.getaddrinfo("some_site.com",0,0,0,0)
for result in socket_info:
    ns_ip = result[4][0]
    if distinct_ips.count(ns_ip)==0:
        distinct_ips.append(ns_ip)
        print(ns_ip)
1
grepit

Si nslookup ou Dig ne sont pas installés sur le système, j'utilise les éléments suivants pour une utilisation interactive, sortie de recherche dns compatible nslookup

import socket,argparse

def main(args):
    fqdn = args.fqdn
    try:
        ip_addr = socket.gethostbyname(fqdn)
        server_info()
        print 'Name: ' + fqdn
        print 'Address: ' + ip_addr
    except socket.gaierror:
        server_info()
        print "** server can't find {0}: NXDOMAIN".format(fqdn)

def server_info():
    lines = [line.rstrip('\n') for line in open('/etc/resolv.conf')]
    for line in lines:
        if line.startswith('nameserver'):
            print 'Server:\t\t' + line.split()[1]
            print 'Address:\t' + line.split()[1] + '#53\n'
            break

if __== '__main__':
    parser = argparse.ArgumentParser(description='Python nslookup utility')
    parser.add_argument('fqdn', type=str, help='Fully qualified domain name')
    args = parser.parse_args()
    main(args)
0
lainatnavi