Jako alias myip
, powinien działać wszędzie:
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])'"
- Działa poprawnie z Python 2.x, Python 3.x, nowoczesnymi i starymi dystrybucjami Linux, OSX / macOS i Windows do wyszukiwania aktualnego adresu IPv4.
- Nie zwróci poprawnego wyniku dla maszyn z wieloma adresami IP, IPv6, bez skonfigurowanego adresu IP lub bez dostępu do Internetu.
To samo co powyżej, ale tylko kod 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])
- Spowoduje to zgłoszenie wyjątku, jeśli nie skonfigurowano adresu IP.
Wersja, która będzie działać również w sieciach LAN bez połączenia z Internetem:
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])
(dzięki @ccpizza )
Tło :
Korzystanie socket.gethostbyname(socket.gethostname())
nie działało tutaj, ponieważ jeden z komputerów, na których byłem, miał /etc/hosts
zduplikowane wpisy i odniesienia do siebie. socket.gethostbyname()
zwraca tylko ostatni wpis w /etc/hosts
.
To była moja pierwsza próba usunięcia wszystkich adresów zaczynających się od "127."
:
import socket
print([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
Działa to z Pythonem 2 i 3 w systemach Linux i Windows, ale nie obsługuje kilku urządzeń sieciowych ani IPv6. Jednak przestał działać na ostatnich dystrybucjach Linuksa, więc zamiast tego spróbowałem tej alternatywnej techniki. Próbuje połączyć się z serwerem Google DNS 8.8.8.8
na porcie 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])
Następnie połączyłem dwie powyższe techniki w jedną linijkę, która powinna działać wszędzie, i myip
na początku tej odpowiedzi utworzyłem alias i fragment kodu w języku Python.
Wraz ze wzrostem popularności protokołu IPv6 oraz w przypadku serwerów z wieloma interfejsami sieciowymi korzystanie z zewnętrznego modułu Python do znajdowania adresu IP jest prawdopodobnie bardziej niezawodne i niezawodne niż którakolwiek z wymienionych tutaj metod.