Comme un alias s'appelle myip
, cela devrait fonctionner partout:
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])'"
- Fonctionne correctement avec Python 2.x, Python 3.x, les distributions Linux modernes et anciennes, OSX / macOS et Windows pour trouver l'adresse IPv4 actuelle.
- Ne retournera pas le résultat correct pour les machines avec plusieurs adresses IP, IPv6, aucune adresse IP configurée ou aucun accès Internet.
Comme ci-dessus, mais uniquement le code 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])
- Cela lèvera une exception si aucune adresse IP n'est configurée.
Version qui fonctionnera également sur les réseaux locaux sans connexion 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])
(merci @ccpizza )
Contexte :
L'utilisation socket.gethostbyname(socket.gethostname())
n'a pas fonctionné ici, car l'un des ordinateurs sur lesquels je me trouvais avait une /etc/hosts
entrée en double et des références à lui-même. socket.gethostbyname()
renvoie uniquement la dernière entrée /etc/hosts
.
C'était ma première tentative, qui élimine toutes les adresses en commençant par "127."
:
import socket
print([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
Cela fonctionne avec Python 2 et 3, sous Linux et Windows, mais ne concerne pas plusieurs périphériques réseau ou IPv6. Cependant, il a cessé de fonctionner sur les distributions récentes de Linux, j'ai donc plutôt essayé cette technique alternative. Il essaie de se connecter au serveur DNS de Google 8.8.8.8
sur le port53
:
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])
Ensuite, j'ai combiné les deux techniques ci-dessus en une seule doublure qui devrait fonctionner partout, et j'ai créé le myip
alias et l'extrait de code Python en haut de cette réponse.
Avec la popularité croissante d'IPv6 et pour les serveurs avec plusieurs interfaces réseau, l'utilisation d'un module Python tiers pour trouver l'adresse IP est probablement à la fois plus robuste et fiable que l'une des méthodes répertoriées ici.