Comment puis-je trouver des adresses IP locales (par exemple 192.168.xx ou 10.0.xx) dans la plate-forme Python indépendamment et en utilisant uniquement la bibliothèque standard?
python
networking
ip-address
UnkwnTech
la source
la source
ifconfig -a
et utiliser la sortie à partir de là ...ip addr
est beaucoup plus approprié (et plus facile à analyser, à démarrer).bind
un socket vers une interface particulière, c'est une question de politique. Si l'adresse IP locale est nécessaire pour la remettre à un homologue afin que l'homologue puisse "rappeler", c'est-à-dire pour rétablir une connexion avec la machine locale, la situation dépend de l'existence de NAT (Network Address Translation). boîtes entre les deux. S'il n'y a pas de NAT,getsockname
c'est un bon choix.Réponses:
Cela ne fonctionnera pas toujours (retourne
127.0.0.1
sur les machines ayant le nom d'hôte en/etc/hosts
tant que127.0.0.1
), un paliatif serait ce que gimel montre, utilisez à lasocket.getfqdn()
place. Bien sûr, votre machine a besoin d'un nom d'hôte résoluble.la source
socket.gethostbyname_ex(socket.gethostname())[-1]
Je viens de le trouver, mais cela semble un peu hackish, mais ils disent qu'il a essayé sur * nix et que je l'ai fait sur Windows et cela a fonctionné.
Cela suppose que vous disposez d'un accès Internet et qu'il n'y a pas de proxy local.
la source
Cette méthode renvoie l'IP "primaire" sur la boîte locale (celle avec une route par défaut) .
Python 3 ou 2:
Cela renvoie une seule IP qui est la principale (celle avec une route par défaut). Si vous avez plutôt besoin de toutes les IP attachées à toutes les interfaces (y compris localhost, etc.), consultez cette réponse .
Si vous êtes derrière un pare-feu NAT comme votre box wifi à la maison, cela ne montrera pas votre IP NAT publique, mais plutôt votre IP privée sur le réseau local qui a une route par défaut vers votre routeur WIFI local; obtenir l'IP externe de votre routeur wifi nécessiterait soit de l'exécuter sur CETTE boîte, soit de se connecter à un service externe tel que whatismyip.com/whatismyipaddress.com qui pourrait refléter l'IP ... mais cela est complètement différent de la question d'origine. :)
la source
socket.gethostbyname(socket.gethostname())
donne des résultats horribles.Comme un alias s'appelle
myip
, cela devrait fonctionner partout:Comme ci-dessus, mais uniquement le code Python:
Version qui fonctionnera également sur les réseaux locaux sans connexion Internet:
(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."
: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
: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.
la source
socket.getaddrinfo()
devrait fonctionner de manière cohérente sur toutes les plateformes - mais je ne l'ai vérifié que sur Linux, je ne me suis pas soucié des autres systèmes d'exploitation./etc/resolve.conf: No such file or directory
et j'ai l'adresse IPv4 locale indiquée parifconfig
.Vous pouvez utiliser le module netifaces . Tapez simplement:
dans votre shell de commande et il s'installera sur l'installation Python par défaut.
Ensuite, vous pouvez l'utiliser comme ceci:
Sur mon ordinateur, il a imprimé:
L'auteur de ce module affirme qu'il devrait fonctionner sous Windows, UNIX et Mac OS X.
la source
Méthode API Socket
voir https://stackoverflow.com/a/28950776/711085
Inconvénients:
Méthode du réflecteur
(Notez que cela ne répond pas à la question de l'OP concernant l'adresse IP locale, par exemple 192.168 ...; cela vous donne votre adresse IP publique, ce qui pourrait être plus souhaitable selon le cas d'utilisation.)
Vous pouvez interroger certains sites comme whatismyip.com (mais avec une API), tels que:
ou si vous utilisez python2:
Avantages:
Inconvénients (et solutions):
edit : Bien qu'au départ, je pensais que ces méthodes étaient vraiment mauvaises (à moins que vous n'utilisiez de nombreuses solutions de rechange, le code pourrait ne plus être pertinent dans plusieurs années), cela pose la question "qu'est-ce qu'Internet?". Un ordinateur peut avoir de nombreuses interfaces pointant vers de nombreux réseaux différents. Pour une description plus approfondie du sujet, google for
gateways and routes
. Un ordinateur peut être en mesure d'accéder à un réseau interne via une passerelle interne, ou d'accéder au Web mondial via une passerelle sur par exemple un routeur (généralement le cas). L'adresse IP locale que l'OP demande n'est bien définie que par rapport à une seule couche de liaison, vous devez donc spécifier cela ("est-ce la carte réseau ou le câble Ethernet dont nous parlons?") . Il peut y avoir plusieurs réponses non uniques à cette question telle que posée. Cependant, l'adresse IP globale sur le World Wide Web est probablement bien définie (en l'absence de fragmentation massive du réseau): probablement le chemin de retour via la passerelle qui peut accéder aux TLD.la source
Si l'ordinateur dispose d'une route vers Internet, cela fonctionnera toujours pour obtenir l'adresse IP locale préférée, même si / etc / hosts n'est pas défini correctement.
la source
8.8.8.8
est-ce qu'un serveur google dns peut-on le faire avec un serveur dns local?Sous Linux:
la source
ioctl
). Le socket n'est pas lié à l'interface pour laquelle vous voulez des informations sur l'adr - c'est juste un mécanisme de communication entre l'espace utilisateur et le noyau. en.wikipedia.org/wiki/Ioctl lxr.free-electrons.com/source/net/socket.cstruct.pack('16sH14s', iface, socket.AF_INET, '\x00'*14)
devrait être remplacé parstruct.pack('16sH14s', iface.encode('utf-8'), socket.AF_INET, b'\x00'*14)
ioctl
est une interface héritée, je ne crois pas, prend en charge IPv6 et ne le sera probablement jamais. Je pense que la bonne façon est via Netlink qui n'est pas très simple en Python. Je pense que libc devrait avoir la fonctiongetifaddrs
accessible via lectypes
module pythons qui peut fonctionner - man7.org/linux/man-pages/man3/getifaddrs.3.htmlim en utilisant le module suivant:
Testé avec Windows et Linux (et ne nécessite pas de modules supplémentaires pour ceux-ci) destiné à être utilisé sur des systèmes qui sont dans un seul LAN basé sur IPv4.
La liste fixe des noms d'interface ne fonctionne pas pour les versions récentes de Linux, qui ont adopté la modification systemd v197 concernant les noms d'interface prévisibles, comme l'a souligné Alexander . Dans de tels cas, vous devez remplacer manuellement la liste par les noms d'interface sur votre système ou utiliser une autre solution comme netifaces .
la source
enp0s25
. Pour plus d'informations, voir wiki.archlinux.org/index.php/Network_Configuration#Device_namesstruct.pack('256s', bytes(ifname[:15]))
J'utilise ceci sur mes machines Ubuntu:
Ça ne marche pas.
la source
Si vous ne souhaitez pas utiliser de packages externes et ne comptez pas sur des serveurs Internet externes, cela peut vous aider. Il s'agit d'un exemple de code que j'ai trouvé sur Google Code Search et modifié pour renvoyer les informations requises:
Usage:
Comme il dépend
windll
, cela ne fonctionnera que sous Windows.la source
Sur Debian (testé) et je soupçonne la plupart des Linux ..
Sur MS Windows (testé)
la source
hostname: illegal option -- I\nusage: hostname [-fs] [name-of-host]
Une version que je ne crois pas encore publiée. J'ai testé avec python 2.7 sur Ubuntu 12.04.
Trouvé cette solution à: http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/
Exemple de résultat:
la source
Variation sur la réponse de ninjagecko. Cela devrait fonctionner sur n'importe quel LAN qui autorise la diffusion UDP et ne nécessite pas l'accès à une adresse sur le LAN ou Internet.
la source
<broadcast>
un nom d'hôte valide? !! Combien de ces types de noms d'hôtes verbaux sont valides?Je crains qu'il n'y ait pas de bons moyens indépendants de la plate-forme pour ce faire, à part la connexion à un autre ordinateur et le fait de vous envoyer votre adresse IP. Par exemple: findmyipaddress . Notez que cela ne fonctionnera pas si vous avez besoin d'une adresse IP derrière NAT, à moins que l'ordinateur auquel vous vous connectez ne soit également derrière NAT.
Voici une solution qui fonctionne sous Linux: obtenez l'adresse IP associée à une interface réseau .
la source
Une façon simple de produire une sortie "propre" via des utilitaires de ligne de commande:
Il affichera toutes les adresses IPv4 du système.
la source
Pour info je peux vérifier que la méthode:
Fonctionne sous OS X (10.6,10.5), Windows XP et sur un serveur de département RHEL bien administré. Cela n'a pas fonctionné sur une machine virtuelle CentOS très minimale sur laquelle je fais juste un piratage du noyau. Donc, pour cette instance, vous pouvez simplement vérifier une adresse 127.0.0.1 et dans ce cas, procédez comme suit:
Et puis analysez l'adresse IP de la sortie. Il convient de noter que ifconfig n'est pas dans le PATH d'un utilisateur normal par défaut et c'est pourquoi je donne le chemin complet dans la commande. J'espère que ça aide.
la source
Il s'agit d'une variante de la réponse d'UnkwnTech - elle fournit une
get_local_addr()
fonction, qui renvoie l'adresse IP LAN principale de l'hôte. Je le poste car cela ajoute un certain nombre de choses: prise en charge d'ipv6, gestion des erreurs, ignorant les adresses localeshost / linklocal et utilise un addr TESTNET (rfc5737) pour se connecter.la source
None
get_local_addr(remove="www.google.com")
retour? La journalisation de lasocket.error
levée par _get_local_addr () peut aider au diagnostic.la source
['fe80::34e8:fe19:1459:2cde%22','fe80::d528:99fb:d572:e289%12', '192.168.56.1', '192.168.1.2']
sur le bureau Windows.Cela fonctionnera sur la plupart des boîtiers Linux:
la source
Cette réponse est ma tentative personnelle de résoudre le problème d'obtention de l'IP LAN, car elle a
socket.gethostbyname(socket.gethostname())
également renvoyé 127.0.0.1. Cette méthode ne nécessite pas Internet uniquement une connexion LAN. Le code est pour Python 3.x mais pourrait facilement être converti pour 2.x. Utilisation de la diffusion UDP:la source
127.0.1.1
est votre véritable adresse IP. Plus généralement, un ordinateur peut avoir un nombre quelconque d'adresses IP. Vous pouvez les filtrer pour les réseaux privés - 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12 et 192.168.0.0/16.Cependant, il n'existe aucun moyen multiplateforme pour obtenir toutes les adresses IP. Sous Linux, vous pouvez utiliser l'
SIOCGIFCONF
ioctl.la source
Un léger raffinement de la version des commandes qui utilise la commande IP et renvoie les adresses IPv4 et IPv6:
la source
Eh bien, vous pouvez utiliser la commande "ip route" sur GNU / Linux pour connaître votre adresse IP actuelle.
Cela montre l'IP donnée à l'interface par le serveur DHCP exécuté sur le routeur / modem. Habituellement, "192.168.1.1/24" est l'IP du réseau local où "24" signifie la plage d'adresses IP possibles donnée par le serveur DHCP dans la plage de masques.
Voici un exemple: Notez que PyNotify est juste un ajout pour clarifier mon point et n'est pas du tout requis
L'avantage est que vous n'avez pas besoin de spécifier l'interface réseau. C'est assez utile lors de l'exécution d'un serveur de socket
Vous pouvez installer PyNotify en utilisant easy_install ou même Pip:
ou
ou dans un script / interprète python
la source
Si vous recherchez une adresse IPV4 différente de votre adresse IP localhost
127.0.0.1
, voici un morceau de codes python:Qui peut également s'écrire sur une seule ligne:
Même si vous mettez
localhost
dans/etc/hostname
, le code sera toujours votre adresse IP locale.la source
Pour linux, vous pouvez simplement utiliser
check_output
lahostname -I
commande système comme ceci:la source
Remarque: cela n'utilise pas la bibliothèque standard, mais assez simple.
$ pip install pif
la source
netifaces est disponible via pip et easy_install. (Je sais, ce n'est pas dans la base, mais cela pourrait valoir la peine d'être installé.)
netifaces a quelques bizarreries sur toutes les plateformes:
Voici quelques codes Netifaces pour jouer avec:
Le code ci-dessus ne mappe pas une adresse à son nom d'interface (utile pour générer des règles ebtables / iptables à la volée). Voici donc une version qui conserve les informations ci-dessus avec le nom de l'interface dans un tuple:
Et, non, je ne suis pas amoureux de la compréhension des listes. C'est juste la façon dont mon cerveau fonctionne de nos jours.
L'extrait suivant l'imprimera entièrement:
Prendre plaisir!
la source
Une version Python 3.4 utilisant le package asyncio nouvellement introduit.
Ceci est basé sur l' excellente réponse d' UnkwnTech .
la source
Pour obtenir l'adresse IP, vous pouvez utiliser une commande shell directement en python :
la source