Con los años, ha habido algunos cambios en cómo algunas funciones y comandos proporcionan una salida. Por eso, es difícil seguir tutoriales más antiguos, que a veces no se ajustan a las últimas revisiones del software y sus comandos.

Uno de esos cambios ocurrió mientras estaba usando nslookup y python para buscar ip addresses en Windows, ya que no soy dueño de un Mac o Linux.

¿Cómo, podemos obtener, solo la dirección IP de una 'URL de nivel superior' (tld) usando python y nslookup, a partir de 2019?

1
SowingFiber 2 oct. 2019 a las 19:05

3 respuestas

La mejor respuesta

No use herramientas externas para necesidades que se pueden hacer completamente dentro de su lenguaje de programación usando la biblioteca adecuada, que puede ser dnspython en su caso.

In [2]: import dns

In [3]: import dns.resolver

In [5]: import dns.rdataclass

In [7]: import dns.rdatatype

In [9]: ans = dns.resolver.query('www.example.com', rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN)

In [10]: print ans.rrset
www.example.com. 43193 IN A 93.184.216.34

In [12]: print ans.rrset[0]
93.184.216.34

Lea la documentación completa en http://www.dnspython.org/docs/1.16.0 / para más detalles, especialmente los parámetros de entrada y salida.

Dos puntos importantes:

  • no asuma que query siempre tendrá éxito; asegúrese de manejar sus errores
  • no asuma que query necesariamente le devolverá registros del tipo que esperaba, puede obtener algo completamente diferente, por lo que debe verificar y no asumir a ciegas.
1
Patrick Mevzek 3 oct. 2019 a las 03:15

Busqué SO y encontré esta respuesta

La solución proporcionada es un buen punto de partida. Según los requisitos anteriores, la solución podría modificarse para adaptarse al caso de uso anterior.

Si usa nslookup google.com en su consola en Windows, encontrará una salida similar:

Non-authoritative answer:

Server:  UnKnown
Address:  192.168.0.1

Name:    facebook.com
Addresses:  2a03:2880:f12f:183:face:b00c:0:25de
      31.13.79.35

Siguiendo la solución referenciada, estas dos líneas son el corazón de nuestra solución:

process = subprocess.Popen(["nslookup", url], stdout=subprocess.PIPE)
output = str(process.communicate()[0]).split('\\r\\n')

Si imprime el resultado en la consola, obtendrá un resultado similar a este:

["b'Server:  UnKnown", 'Address:  192.168.0.1', '', 'Name:    facebook.com', 'Addresses:  2a03:2880:f12f:183:face:b00c:0:25de', '\\t  31.13.79.35', '', "'"]

Esta lista es suficiente para el caso de uso anterior. Lo siguiente que debe hacer es encontrar una manera confiable de obtener siempre el 6th element que es "\\t 31.13.79.35"

Para simplificar las cosas, utilicé el corte de índice para obtener 6th element usando output[5].

Probé este código entre 10 y 15 veces con diferentes URL y obtuve resultados similares. Una mejor manera sería detectar de alguna manera la dirección iterando a través de los elementos de la lista en la salida.

Nuevamente para el caso de uso anterior, usar output[5] funciona bastante bien. Si alguien puede contribuir de una manera más confiable para detectar la dirección IP en la lista, hágalo.

get_ip_address.py

import subprocess


def get_ip_address(url):
    process = subprocess.Popen(
        ["nslookup", url], stdout=subprocess.PIPE)
    output = str(process.communicate()[0]).split('\\r\\n')
    address = output[5].replace('\\t ', '')
    return address


print(get_ip_address('google.com'))

1
SowingFiber 2 oct. 2019 a las 16:05

Probablemente pueda ahorrarse algo de tiempo usando nmap

pip install python-nmap

Entonces su script de Python es simplemente:

import nmap

scan = nmap.Portscanner()

scan.scan('127.0.0.1', '21-443') # Returns scan on ports from 21-433 

Si está escaneando algo con lo que desea tener cuidado, considere usar proxychains, que es un servicio basado en tor que usa SOCKS5. Puede usar variaciones como -O -I para identificar los sistemas operativos que usa la dirección IP y alguna información sobre qué sockets están abiertos o cerrados.

Existen muchos métodos útiles, como:

>>> scan.scaninfo()
{'tcp': {'services': '22-443', 'method': 'connect'}}

>>> scan.all_hosts()
['127.0.0.1']

>>> scan['127.0.0.1'].hostname()
'localhost'

>>> scan['127.0.0.1'].state()
'up'

>>> scan['127.0.0.1'].all_protocols()
['tcp']

>>> scan['127.0.0.1']['tcp'].keys()
[80, 25, 443, 22, 111]

>>> scan['127.0.0.1'].has_tcp(22)
True

>>> scan['127.0.0.1'].has_tcp(23)
False

>>> scan['127.0.0.1']['tcp'][22]
{'state': 'open', 'reason': 'syn-ack', 'name': 'ssh'}

>>> scan['127.0.0.1'].tcp(22)
{'state': 'open', 'reason': 'syn-ack', 'name': 'ssh'}
-1
Barb 2 oct. 2019 a las 17:35
58205268