¿Existen bibliotecas existentes para analizar una cadena como una dirección ipv4 o ipv6, o al menos identificar si una cadena es una dirección IP (de cualquier tipo)?Comprobando las direcciones IP
Respuesta
Sí, existe el módulo ipaddr
, que puede ayudar a verificar si una cadena es una dirección IPv4/IPv6 y detectar su versión.
import ipaddr
import sys
try:
ip = ipaddr.IPAddress(sys.argv[1])
print '%s is a correct IP%s address.' % (ip, ip.version)
except ValueError:
print 'address/netmask is invalid: %s' % sys.argv[1]
except:
print 'Usage : %s ip' % sys.argv[0]
Pero este no es un módulo estándar, por lo que no siempre es posible usarlo. También intente utilizar el módulo estándar socket
:
import socket
try:
socket.inet_aton(addr)
print "ipv4 address"
except socket.error:
print "not ipv4 address"
Para direcciones IPv6 debe utilizar socket.inet_pton(socket.AF_INET6, address)
.
También quiero señalar, que inet_aton
tratarán de convertir (y realmente convertirlo) como direcciones 10
, 127
, etc., que no se parecen a las direcciones IP.
ipaddr - Paquete de manipulación de direcciones IP de Google.
Tenga en cuenta que recientemente se ha aceptado una propuesta para incluir una versión revisada del paquete en la biblioteca estándar de Python (consulte PEP 3144).
Nótese que si bien esta biblioteca de hecho ha sido aceptado para su inclusión en la biblioteca estándar, que no está incluido en ninguna versión de Python estable todavía.(Por supuesto, todavía puede instalar la versión de PyPI). –
@Sven Marnach - buen punto, editado para reflejar esto. – Ghopper21
para IPv4 Puede utilizar
socket.inet_aton(some_string)
si se produce una excepción, some_string
no es una dirección IP válida
Para IPv6, puede utilizar:
socket.inet_pton(socket.AF_INET6, some_string)
de nuevo, arroja una excepción si some_string
no es una dirección válida
Esto solo funciona para vor Direcciones IPv4, sin embargo. –
@Sven, agregué un camino para v6, es un poco más complicado –
Oh, no estaba al tanto de esto. Creo que esta es la mejor solución hasta ahora. Eliminaré la mía. –
solución IPv4 + IPv6 basándose únicamente en la biblioteca estándar. Devuelve 4
o 6
o aumenta ValueError
.
try:
# Python 3.3+
import ipaddress
def ip_kind(addr):
return ipaddress.ip_address(addr).version
except ImportError:
# Fallback
import socket
def ip_kind(addr):
try:
socket.inet_aton(addr)
return 4
except socket.error: pass
try:
socket.inet_pton(socket.AF_INET6, addr)
return 6
except socket.error: pass
raise ValueError(addr)
Si sabe con certeza que la dirección es válida y sólo se trata de decidir si se trata de IPv4 o IPv6, no sería suficiente para hacer precisamente:
if ":" in address:
print("Ipv6")
else:
print("Ipv4")
No sabía que era una IP. Necesitaba verificar si era una IP. Actualicé la pregunta para mayor claridad. – Rory
Puede utilizar el netaddr
biblioteca. Tiene métodos valid_ipv4/valid_ipv6:
import netaddr
if netaddr.valid_ipv4(str_ip) is True:
print("IP is IPv4")
else:
if netaddr.valid_ipv6(str_ip) is True:
print("IP is IPv6")
prefiero ip_interface ya que maneja las situaciones con y sin máscara prefijo, por ejemplo, tanto "10.1.1.1/24", así como simplemente "10.1.1.1". Ni que decir tiene, que funciona tanto para V4, así como v6
from ipaddress import ip_interface
ip_interface("10.1.1.1/24").ip
ip_interface("10.1.1.1/24").ip.version
ip_interface("10.1.1.1").ip
ip_interface("10.1.1.1").ip.version
- 1. IP todas las direcciones en una subred
- 2. Rieles: bloquear todas las direcciones IP excepto las seguras
- 3. ¿Diferentes navegadores, direcciones IP diferentes?
- 4. Asociar direcciones IP con países
- 5. UserHostAddress da direcciones IP incorrectas
- 6. Ordenando direcciones IP en vim
- 7. rangos de direcciones IP privadas
- 8. Dns.GetHostEntry devuelve varias direcciones IP
- 9. Obtener todas las direcciones IP asignadas a un servidor
- 10. Cómo censurar las direcciones IP en un archivo con Python?
- 11. Cómo hacer que Fiddler escuche todas las direcciones IP
- 12. Script Bash para obtener todas las direcciones IP
- 13. ¿Las direcciones IP y los puertos deben considerarse confidenciales?
- 14. .htaccess redirigir a todas las direcciones IP, pero la mía
- 15. Obtener todas las direcciones IP en la máquina
- 16. Delphi, ¿Cómo obtener todas las direcciones IP locales?
- 17. ¿Cómo puedo analizar las direcciones IP y los rangos de direcciones con Perl?
- 18. Cómo bloquear direcciones IP o clases IP en ASP.NET
- 19. ¿Cómo se escucha en múltiples direcciones IP?
- 20. C#: Enumerar direcciones IP en un rango
- 21. lista de direcciones IP ordenar usando C#
- 22. ¿Todos los dominios tienen direcciones IP únicas?
- 23. Google App Engine: lista de direcciones IP
- 24. 3G/Edge/GPRS Direcciones IP y geocodificación
- 25. ¿Es posible ver las direcciones IP del historial de Chrome en lugar de las urls?
- 26. Azure SQL Server Firewall Rango de direcciones IP
- 27. ¿Por qué request.env ['REMOTE_ADDR'] devuelve dos direcciones IP?
- 28. ¿Cómo puedo generar un rango de direcciones IP en Perl?
- 29. Bash lista completa de direcciones IP para un dominio
- 30. Uso de direcciones IP de salida diferentes en Perl
AttributeError: el objeto 'module' no tiene el atributo 'ip_address' – Rory
@Blazemore: en las versiones nuevas del módulo, use 'IPAddress'; arregló mi respuesta; ¡Gracias por la sugerencia! –
Solo para agregar un poco de fondo, el socket impl es mucho más rápido. – marcinkuzminski