¿Cómo puedo encontrar direcciones IP locales (es decir, 192.168.xx o 10.0.xx) en la plataforma Python de forma independiente y usando solo la biblioteca estándar?
python
networking
ip-address
UnkwnTech
fuente
fuente
ifconfig -a
y usar la salida de allí ...ip addr
es mucho más adecuado (y más fácil de analizar, arrancar).bind
un socket a una interfaz particular, entonces es una cuestión de política. Si se necesita la dirección IP local para entregarla a un par para que el par pueda "devolver la llamada", es decir, para abrir una conexión de nuevo a la máquina local, entonces la situación depende de si hay alguna NAT (traducción de dirección de red) cajas en el medio. Si no hay NAT,getsockname
es una buena opción.Respuestas:
Esto no funcionará siempre (regresa
127.0.0.1
en máquinas que tienen el nombre de host/etc/hosts
como127.0.0.1
), un paliativo sería lo que muestra gimel, usesocket.getfqdn()
en su lugar. Por supuesto, su máquina necesita un nombre de host resoluble.fuente
socket.gethostbyname_ex(socket.gethostname())[-1]
Acabo de encontrar esto, pero parece un poco difícil, sin embargo, dicen que lo probé en * nix y lo hice en Windows y funcionó.
Esto supone que tiene acceso a Internet y que no hay un proxy local.
fuente
Este método devuelve la IP "primaria" en el cuadro local (el que tiene una ruta predeterminada) .
Python 3 o 2:
Esto devuelve una única IP que es la principal (la que tiene una ruta predeterminada). Si necesita en su lugar todas las IP conectadas a todas las interfaces (incluido localhost, etc.), consulte esta respuesta .
Si está detrás de un cortafuegos NAT como su caja wifi en casa, entonces esto no mostrará su IP NAT pública, sino su IP privada en la red local que tiene una ruta predeterminada a su enrutador WIFI local; obtener la IP externa de su enrutador wifi requeriría ejecutar esto en ESA caja, o conectarse a un servicio externo como whatismyip.com/whatismyipaddress.com que podría reflejar la IP ... pero eso es completamente diferente de la pregunta original. :)
fuente
socket.gethostbyname(socket.gethostname())
da resultados horriblesComo se llama un alias
myip
, eso debería funcionar en todas partes:Igual que el anterior, pero solo el código Python:
Versión que también funcionará en LAN sin conexión a Internet:
(gracias @ccpizza )
Antecedentes :
El uso
socket.gethostbyname(socket.gethostname())
no funcionó aquí, porque una de las computadoras en las que estaba tenía/etc/hosts
entradas duplicadas y referencias a sí misma.socket.gethostbyname()
solo devuelve la última entrada en/etc/hosts
.Este fue mi intento inicial, que elimina todas las direcciones que comienzan con
"127."
:Esto funciona con Python 2 y 3, en Linux y Windows, pero no se ocupa de varios dispositivos de red o IPv6. Sin embargo, dejó de funcionar en distribuciones recientes de Linux, así que probé esta técnica alternativa. Intenta conectarse al servidor DNS de Google
8.8.8.8
en el puerto53
:Luego combiné las dos técnicas anteriores en una línea que debería funcionar en todas partes, y creé el
myip
alias y el fragmento de Python en la parte superior de esta respuesta.Con la creciente popularidad de IPv6, y para servidores con múltiples interfaces de red, el uso de un módulo Python de terceros para encontrar la dirección IP es probablemente más robusto y confiable que cualquiera de los métodos enumerados aquí.
fuente
socket.getaddrinfo()
debería funcionar de manera consistente en todas las plataformas, pero solo lo comprobé en Linux, no me molesté en ningún otro sistema operativo./etc/resolve.conf: No such file or directory
y tengo la dirección IPv4 local mostrada porifconfig
.Puede usar el módulo netifaces . Sólo tipo:
en su shell de comandos y se instalará en la instalación predeterminada de Python.
Entonces puedes usarlo así:
En mi computadora imprimió:
El autor de este módulo afirma que debería funcionar en Windows, UNIX y Mac OS X.
fuente
Método de API de socket
ver https://stackoverflow.com/a/28950776/711085
Desventajas:
Método de reflector
(Tenga en cuenta que esto no responde a la pregunta del OP sobre la dirección IP local, por ejemplo, 192.168 ...; le da su dirección IP pública, que podría ser más deseable dependiendo del caso de uso).
Puede consultar algún sitio como whatismyip.com (pero con una API), como:
o si usa python2:
Ventajas:
Desventajas (y soluciones):
editar : Aunque inicialmente pensé que estos métodos eran realmente malos (a menos que use muchos fallos, el código puede ser irrelevante dentro de muchos años), plantea la pregunta "¿qué es Internet?". Una computadora puede tener muchas interfaces que apuntan a muchas redes diferentes. Para una descripción más completa del tema, google for
gateways and routes
. Una computadora puede acceder a una red interna a través de una puerta de enlace interna, o acceder a la red mundial a través de una puerta de enlace en, por ejemplo, un enrutador (generalmente el caso). La dirección IP local sobre la que pregunta el OP solo está bien definida con respecto a una sola capa de enlace, por lo que debe especificar eso ("¿es de la tarjeta de red o del cable de Ethernet, de lo que estamos hablando?") . Puede haber múltiples respuestas no únicas a esta pregunta como se plantea. Sin embargo, la dirección IP global en la red mundial probablemente esté bien definida (en ausencia de una fragmentación masiva de la red): probablemente la ruta de retorno a través de la puerta de enlace que puede acceder a los TLD.fuente
Si la computadora tiene una ruta a Internet, esto siempre funcionará para obtener la dirección IP local preferida, incluso si / etc / hosts no está configurado correctamente.
fuente
8.8.8.8
es un servidor dns de google ¿podemos hacerlo con un servidor dns local?En Linux:
fuente
ioctl
). El socket no está vinculado a la interfaz para la que desea información adicional, es solo un mecanismo de comunicación entre el espacio de usuario y el kernel. en.wikipedia.org/wiki/Ioctl lxr.free-electrons.com/source/net/socket.cstruct.pack('16sH14s', iface, socket.AF_INET, '\x00'*14)
debe reemplazarse construct.pack('16sH14s', iface.encode('utf-8'), socket.AF_INET, b'\x00'*14)
ioctl
es una interfaz heredada que no creo que sea compatible con IPv6 y probablemente nunca lo hará. Creo que la forma 'correcta' es a través de Netlink, que no es muy sencillo en Python. Creo que libc debería tener la función a lagetifaddrs
que se puede acceder a través delctypes
módulo de pitones que puede funcionar - man7.org/linux/man-pages/man3/getifaddrs.3.htmlEstoy usando el siguiente módulo:
Probado con Windows y Linux (y no requiere módulos adicionales para esos) destinados a su uso en sistemas que se encuentran en una sola LAN basada en IPv4.
La lista fija de nombres de interfaz no funciona para las versiones recientes de Linux, que han adoptado el cambio systemd v197 con respecto a los nombres de interfaz predecibles como lo señala Alexander . En tales casos, debe reemplazar manualmente la lista con los nombres de interfaz en su sistema, o usar otra solución como netifaces .
fuente
enp0s25
. Para obtener más información, consulte wiki.archlinux.org/index.php/Network_Configuration#Device_namesstruct.pack('256s', bytes(ifname[:15]))
Lo uso en mis máquinas ubuntu:
Esto no funciona
fuente
Si no desea utilizar paquetes externos y no desea confiar en servidores externos de Internet, esto podría ayudar. Es una muestra de código que encontré en Google Code Search y modifiqué para devolver la información requerida:
Uso:
Como se basa
windll
, esto solo funcionará en Windows.fuente
En Debian (probado) y sospecho que la mayoría de Linux ...
En MS Windows (probado)
fuente
hostname: illegal option -- I\nusage: hostname [-fs] [name-of-host]
Una versión que no creo que haya sido publicada todavía. Probé con python 2.7 en Ubuntu 12.04.
Encontré esta solución en: http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/
Resultado de ejemplo:
fuente
Variación sobre la respuesta de ninjagecko. Esto debería funcionar en cualquier LAN que permita la transmisión UDP y no requiera acceso a una dirección en la LAN o Internet.
fuente
<broadcast>
un nombre de host válido? ¿Cuántos de estos tipos de nombres de host verbales son válidos?Me temo que no hay una buena plataforma independiente para hacer esto que no sea conectarse a otra computadora y que le envíe su dirección IP. Por ejemplo: findmyipaddress . Tenga en cuenta que esto no funcionará si necesita una dirección IP que esté detrás de NAT a menos que la computadora a la que se está conectando también esté detrás de NAT.
Aquí hay una solución que funciona en Linux: obtenga la dirección IP asociada con una interfaz de red .
fuente
Una forma sencilla de producir resultados "limpios" a través de las utilidades de línea de comandos:
Mostrará todas las direcciones IPv4 en el sistema.
fuente
FYI puedo verificar que el método:
Funciona en OS X (10.6,10.5), Windows XP y en un servidor de departamento RHEL bien administrado. No funcionó en una VM CentOS muy mínima en la que solo hago un poco de pirateo del kernel. Entonces, para esa instancia, solo puede verificar la dirección 127.0.0.1 y, en ese caso, hacer lo siguiente:
Y luego analiza la dirección IP de la salida. Cabe señalar que ifconfig no está en la RUTA de un usuario normal de forma predeterminada y es por eso que doy la ruta completa en el comando. Espero que esto ayude.
fuente
Esta es una variante de la respuesta de UnkwnTech: proporciona una
get_local_addr()
función que devuelve la dirección IP de LAN principal del host. Lo estoy publicando porque esto agrega una serie de cosas: soporte de ipv6, manejo de errores, ignorando los agregadores localeshost / linklocal, y usa un complemento TESTNET (rfc5737) para conectarse.fuente
None
get_local_addr(remove="www.google.com")
regresar? El registro de lossocket.error
lanzados por _get_local_addr () podría ayudar en el diagnóstico.fuente
['fe80::34e8:fe19:1459:2cde%22','fe80::d528:99fb:d572:e289%12', '192.168.56.1', '192.168.1.2']
en el escritorio de Windows.Esto funcionará en la mayoría de las cajas de Linux:
fuente
Esta respuesta es mi intento personal de resolver el problema de obtener la IP de LAN, ya que
socket.gethostbyname(socket.gethostname())
también devolvió 127.0.0.1. Este método no requiere Internet, solo una conexión LAN. El código es para Python 3.x pero podría convertirse fácilmente para 2.x. Usando UDP Broadcast:fuente
127.0.1.1
es tu dirección IP real En términos más generales, una computadora puede tener cualquier número de direcciones IP. Puede filtrarlos para redes privadas: 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12 y 192.168.0.0/16.Sin embargo, no hay una forma multiplataforma para obtener todas las direcciones IP. En Linux, puede usar el
SIOCGIFCONF
ioctl.fuente
Un ligero refinamiento de la versión de los comandos que usa el comando IP y devuelve las direcciones IPv4 e IPv6:
fuente
Bueno, puede usar el comando "ip route" en GNU / Linux para conocer su dirección IP actual.
Esto muestra la IP dada a la interfaz por el servidor DHCP que se ejecuta en el enrutador / módem. Por lo general, "192.168.1.1/24" es la IP para la red local, donde "24" significa el rango de posibles direcciones IP proporcionadas por el servidor DHCP dentro del rango de máscara.
Aquí hay un ejemplo: tenga en cuenta que PyNotify es solo una adición para aclarar mi punto y no es obligatorio en absoluto
La ventaja de esto es que no necesita especificar la interfaz de red. Eso es bastante útil cuando se ejecuta un servidor de socket
Puede instalar PyNotify usando easy_install o incluso Pip:
o
o dentro de un script / intérprete de Python
fuente
Si está buscando una dirección IPV4 diferente de su dirección IP localhost
127.0.0.1
, aquí hay una buena pieza de códigos python:Que también se puede escribir en una sola línea:
Incluso si se pone
localhost
en/etc/hostname
el código todavía le dará a su dirección IP local.fuente
Para Linux, puede usar
check_output
elhostname -I
comando del sistema de la siguiente manera:fuente
Nota: Esto no está usando la biblioteca estándar, pero es bastante simple.
$ pip instalar pif
fuente
netifaces está disponible a través de pip y easy_install. (Lo sé, no está en la base, pero podría valer la pena la instalación).
netifaces tiene algunas rarezas entre plataformas:
Aquí hay un código de netifaces para jugar:
El código anterior no asigna una dirección a su nombre de interfaz (útil para generar reglas de ebtables / iptables sobre la marcha). Así que aquí hay una versión que mantiene la información anterior con el nombre de la interfaz en una tupla:
Y no, no estoy enamorado de las listas de comprensión. Es la forma en que funciona mi cerebro en estos días.
El siguiente fragmento lo imprimirá todo:
¡Disfrutar!
fuente
Una versión de Python 3.4 que utiliza el paquete asyncio recientemente introducido.
Esto se basa en la excelente respuesta de UnkwnTech .
fuente
Para obtener la dirección IP, puede usar un comando de shell directamente en python :
fuente