Wie ein Alias heißt myip
, sollte das überall funktionieren:
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])'"
- Funktioniert ordnungsgemäß mit Python 2.x, Python 3.x, modernen und alten Linux-Distributionen, OSX / macOS und Windows, um die aktuelle IPv4-Adresse zu ermitteln.
- Gibt nicht das richtige Ergebnis für Computer mit mehreren IP-Adressen, IPv6, keiner konfigurierten IP-Adresse oder keinem Internetzugang zurück.
Wie oben, aber nur der Python-Code:
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])
- Dies löst eine Ausnahme aus, wenn keine IP-Adresse konfiguriert ist.
Version, die auch in LANs ohne Internetverbindung funktioniert:
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])
(danke @ccpizza )
Hintergrund :
Die Verwendung socket.gethostbyname(socket.gethostname())
hat hier nicht funktioniert, da einer der Computer, auf denen ich war, einen /etc/hosts
mit doppelten Einträgen und Verweisen auf sich selbst hatte. socket.gethostbyname()
Gibt nur den letzten Eintrag in zurück /etc/hosts
.
Dies war mein erster Versuch, bei dem alle Adressen ausgesondert wurden, beginnend mit "127."
:
import socket
print([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
Dies funktioniert mit Python 2 und 3 unter Linux und Windows, jedoch nicht mit mehreren Netzwerkgeräten oder IPv6. Es funktionierte jedoch nicht mehr mit den neuesten Linux-Distributionen, daher habe ich stattdessen diese alternative Technik ausprobiert. Es wird versucht, eine Verbindung zum Google DNS-Server 8.8.8.8
an folgendem Port herzustellen 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])
Dann kombinierte ich die beiden oben genannten Techniken zu einem Einzeiler, der überall funktionieren sollte, und erstellte den myip
Alias und das Python-Snippet oben in dieser Antwort.
Mit der zunehmenden Beliebtheit von IPv6 und für Server mit mehreren Netzwerkschnittstellen ist die Verwendung eines Python-Moduls eines Drittanbieters zum Ermitteln der IP-Adresse wahrscheinlich sowohl robuster als auch zuverlässiger als jede der hier aufgeführten Methoden.