Como se llama un alias myip
, eso debería funcionar en todas partes:
alias myip="python -c 'import socket; print([l for l in ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith(\"127.\")][:1], [[(s.connect((\"8.8.8.8\", 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]]) if l][0][0])'"
- Funciona correctamente con Python 2.x, Python 3.x, distribuciones de Linux modernas y antiguas, OSX / macOS y Windows para encontrar la dirección IPv4 actual.
- No devolverá el resultado correcto para máquinas con múltiples direcciones IP, IPv6, sin dirección IP configurada o sin acceso a Internet.
Igual que el anterior, pero solo el código Python:
import socket
print([l for l in ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1], [[(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]]) if l][0][0])
- Esto generará una excepción si no hay una dirección IP configurada.
Versión que también funcionará en LAN sin conexión a Internet:
import socket
print((([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")] or [[(s.connect(("8.8.8.8", 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]]) + ["no IP found"])[0])
(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."
:
import socket
print([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
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 puerto 53
:
import socket
print([(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1])
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í.