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?
3 respuestas
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.
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'))
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'}
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.