Come un alias chiamato myip
, dovrebbe funzionare ovunque:
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])'"
- Funziona correttamente con Python 2.x, Python 3.x, distribuzioni Linux moderne e precedenti, OSX / macOS e Windows per trovare l'indirizzo IPv4 corrente.
- Non restituirà il risultato corretto per macchine con più indirizzi IP, IPv6, nessun indirizzo IP configurato o nessun accesso a Internet.
Come sopra, ma solo il codice 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])
- Ciò genererà un'eccezione se non è configurato alcun indirizzo IP.
Versione che funziona anche su LAN senza connessione 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])
(grazie @ccpizza )
Contesto :
L'uso socket.gethostbyname(socket.gethostname())
non ha funzionato qui, perché uno dei computer su cui mi trovavo aveva /etc/hosts
voci e riferimenti duplicati su se stesso. socket.gethostbyname()
restituisce solo l'ultima voce in /etc/hosts
.
Questo è stato il mio tentativo iniziale, che elimina tutti gli indirizzi che iniziano con "127."
:
import socket
print([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
Funziona con Python 2 e 3, su Linux e Windows, ma non si occupa di diversi dispositivi di rete o IPv6. Tuttavia, ha smesso di funzionare su recenti distribuzioni Linux, quindi ho provato questa tecnica alternativa. Tenta di connettersi al server DNS di Google 8.8.8.8
alla porta53
:
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])
Quindi ho combinato le due tecniche di cui sopra in un one-liner che dovrebbe funzionare ovunque e ho creato il myip
alias e lo snippet Python in cima a questa risposta.
Con la crescente popolarità di IPv6 e per i server con più interfacce di rete, l'utilizzo di un modulo Python di terze parti per trovare l'indirizzo IP è probabilmente sia più robusto che affidabile rispetto a qualsiasi dei metodi elencati qui.