2011-04-05 3 views
3

Je suis déjà au courant de plusieurs façons d'obtenir votre adresse IP interne (ifconfig, ip addr,/etc/hosts, etc), mais j'essaye d'écrire un script bash qui retournera toujours le interne IP Le problème est, beaucoup de one-liners (/ sbin/ifconfig | grep inet | head -1 | sed 's/\://' | awk '{print $ 3}') peuvent retourner plusieurs adresses IP, et j'ai besoin de distinguer le interne un manuellement.Trouver l'adresse IP interne avec BASH

Je soupçonne que pour l'ordinateur, il n'y a pas de différence entre et une adresse IP externe et une adresse IP interne, et donc pas 100%, moyen garanti pour obtenir la bonne adresse IP.

Le résultat final est que ce script renvoie l'adresse IP interne, peu importe si son une adresse 192 ou une adresse 204, etc.

Merci à l'avance.

+0

Que voulez-vous dire par « IP interne »? – MattH

+0

Comme Intuited présenté ci-dessous, la question devrait vraiment être de savoir comment trouver l'adresse IP que le serveur utilise lors de la communication à d'autres serveurs sur le même réseau.En général, les serveurs ont deux adresses IP, l'une utilisée pour communiquer en dehors du réseau et l'autre pour communiquer localement. Mais ce n'est pas toujours le cas. Trouver l'adresse IP que le serveur utilise pour communiquer localement est tout ce dont j'avais vraiment besoin. Merci pour toutes les bonnes suggestions et clarifications. – DrewVS

Répondre

8

« hostname -i » devrait nous espérons vous donner le même résultat

0

Cependant, les systèmes peuvent avoir plusieurs adresses IP privées. Vous devez limiter votre recherche sur les adresses IP aux adresses IP privées. 10.0.0.0/8, 172.16.0.0/12 et 192.168.0.0/16.

0

Dans les tous de RFC 1918 espaces d'adresses privées, une machine pourrait éventuellement avoir chaque adresse dans la gamme 10/8, la gamme 172.16/12, et la gamme 192.168/16, pour un total de 17891328 adresses IP, et leur serait les adresses IP "internes" légales. Oh oui, n'oubliez pas IPv6 :) 2^64 adresses possibles par réseau pour une seule machine, qui pourrait participer à plusieurs réseaux.

Ce n'est pas non plus un peu théorique: il est assez courant que les systèmes hôtes VMWare, VirtualBox, QEMU, etc. reçoivent plusieurs adresses RFC 1918; un pour «l'usage habituel», et un qui est utilisé spécifiquement pour communiquer avec les systèmes d'exploitation invités. Ou des routeurs/pare-feu, ils peuvent avoir une douzaine d'IP internes spécifiquement pour sous-réseau d'un réseau pour des raisons de contrôle d'accès.

5

Comme d'autres l'ont mentionné, une machine n'est pas vraiment garantie, ou même susceptible d'avoir une seule adresse IP. Je ne suis pas sûr exactement ce que vous entendez par "IP interne"; cela peut parfois signifier "adresse IP sur le réseau local", c'est-à-dire l'interface qui se connecte à un pare-feu compatible NAT.

Je pense que la meilleure façon de le faire est de se connecter à un hôte sur le réseau que vous voulez et d'utiliser l'adresse d'où provient cette connexion. Ce sera l'interface que la machine utilise normalement pour se connecter à ce réseau. L'utilisateur Unkwntech a eu la même idée sur this thread. Le code ci-dessous est juste tiré de cette réponse.

Je ne sais pas si cela se qualifie vraiment comme une solution "bash", puisqu'il s'agit juste d'un script Python en ligne, mais de toute façon cela vous donnera l'adresse IP locale utilisée pour atteindre google.com. Cela vous donnera donc l'adresse IP de l'interface utilisée par la machine pour atteindre les hôtes Internet.

$ python -c 'import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.connect(("google.com", 80)) 
print s.getsockname()[0]' 

Une solution plus bash-y pourrait utiliser tracepath ou une utilité similaire.

+0

Vous faites un très bon point, merci. J'aurais dû formuler ma question pour être, comment trouver l'adresse IP que les serveurs utilisent lors de la communication sur le réseau interne. Je vais essayer de modifier la solution Python à BASH. – DrewVS

+0

@DrewVS: dans ce cas, vous devriez pouvoir l'obtenir en utilisant le nom d'un hôte sur le réseau interne au lieu de "google.com". Je suppose que déjà réalisé cela. – intuited

Questions connexes