2012-08-06 31 views
8

¿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

14

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.

+0

AttributeError: el objeto 'module' no tiene el atributo 'ip_address' – Rory

+1

@Blazemore: en las versiones nuevas del módulo, use 'IPAddress'; arregló mi respuesta; ¡Gracias por la sugerencia! –

+0

Solo para agregar un poco de fondo, el socket impl es mucho más rápido. – marcinkuzminski

1

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).

+0

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). –

+0

@Sven Marnach - buen punto, editado para reflejar esto. – Ghopper21

7

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

+0

Esto solo funciona para vor Direcciones IPv4, sin embargo. –

+0

@Sven, agregué un camino para v6, es un poco más complicado –

+0

Oh, no estaba al tanto de esto. Creo que esta es la mejor solución hasta ahora. Eliminaré la mía. –

1

Probar

apt-get install python-ipaddr 

u obtener el código fuente de here

4

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) 
1

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") 
+0

No sabía que era una IP. Necesitaba verificar si era una IP. Actualicé la pregunta para mayor claridad. – Rory

2

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") 
0

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 
Cuestiones relacionadas