Como um apelido chamado myip
, isso deve funcionar em qualquer lugar:
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 corretamente com Python 2.x, Python 3.x, distribuições Linux modernas e antigas, OSX / macOS e Windows para encontrar o endereço IPv4 atual.
- Não retornará o resultado correto para máquinas com vários endereços IP, IPv6, sem endereço IP configurado ou sem acesso à Internet.
O mesmo que acima, mas apenas o 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])
- Isso gerará uma exceção se nenhum endereço IP estiver configurado.
Versão que também funcionará em LANs sem conexão à 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])
(obrigado @ccpizza )
Antecedentes :
O uso socket.gethostbyname(socket.gethostname())
não funcionou aqui, porque um dos computadores em que eu estava tinha um /etc/hosts
com entradas duplicadas e referências a si mesmo. socket.gethostbyname()
retorna apenas a última entrada em /etc/hosts
.
Esta foi minha tentativa inicial, que elimina todos os endereços, começando com "127."
:
import socket
print([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
Isso funciona com Python 2 e 3, no Linux e Windows, mas não lida com vários dispositivos de rede ou IPv6. No entanto, ele parou de funcionar em distros recentes do Linux, então tentei essa técnica alternativa. Ele tenta se conectar ao servidor DNS do Google 8.8.8.8
na porta 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])
Em seguida, combinei as duas técnicas acima em uma linha que deve funcionar em qualquer lugar e criei o myip
alias e o snippet do Python na parte superior desta resposta.
Com a crescente popularidade do IPv6 e para servidores com várias interfaces de rede, o uso de um módulo Python de terceiros para encontrar o endereço IP é provavelmente mais robusto e confiável do que qualquer um dos métodos listados aqui.