IP de localhost

Comment une instance Linux détermine-t-elle son adresse IP?

C'est, pas le 127.0.0.1.

Est-ce stocké dans le file ou ifconfig le calcule-t-il à chaque invocation?

J'ai réussi à le résoudre juste pour montrer que j'ai fait un effort, mais ce n'est pas quelque chose que je mettrais dans une application sérieuse:

sudo ifconfig | head -n 2 | tail -n 1 | tr -s " " | tr " " ":" | cut -d":" -f 4 

Les informations peuvent changer à tout moment, elles doivent donc être extraites du kernel, elles ne peuvent pas être stockées dans un file.

Il n'y a pas vraiment moyen d'get cette information. Votre parsing est aussi bonne que celle-ci, sauf que le encoding dur de la deuxième ligne est faux: il n'y a aucune garantie que les interfaces seront listées dans un ordre particulier. Il est assez courant qu'une machine possède plusieurs interfaces: vous pouvez avoir plusieurs maps réseau ou des interfaces virtuelles.

Souvent, l'adresse IP qui vous intéresse est celle associée à l'itinéraire par défaut. Avec la plupart des configurations, vous pouvez get la bonne interface avec la command route , puis extraire l'adresse IP de cette interface avec ifconfig .

 /sbin/ifconfig $(/sbin/route -n | awk '$1 == "0.0.0.0" {print $8}') | awk 'match($0, /inet addr:[.0-9]+/) {print substr($0, RSTART+10, RLENGTH-10)}' 

Notez qu'il n'est pas nécessaire d'appeler sudo . ifconfig et route sont souvent pas dans le PATH par défaut pour les users non root, mais vous pouvez les utiliser sans privilèges spéciaux tant que vous ne lisez que des informations et que vous ne modifiez pas les parameters.

Sur les variantes unix autres que Linux, vous devrez peut-être modifier les commands ci-dessus. La plupart ont des commands appelées ifconfig et route , mais le format de sortie peut être différent.

Sous Linux, au lieu de ifconfig et route , vous pouvez utiliser la command ip de la suite d'outils iproute2 . Bien que les auteurs d'iproute2 considèrent ifconfig et route comme étant déconseillés, l'utilisation d' ip est peu avantageuse car la sortie de ip n'est pas nettement plus facile à parsingr et ifconfig et route sont toujours disponibles alors que certaines installations Linux dépouillées omettent ip .

Il y a des défauts fondamentaux avec votre question. Tout d'abord, les hôtes peuvent (et auront probablement) plus d'une adresse (par exemple, plusieurs interfaces) et même plus d'une adresse par interface. C'est encore plus un problème avec IPv6 où chaque hôte connecté globalement comme au less deux adresses.

Deuxièmement, la meilleure façon de le faire à partir d'un shell varie d'un système à l'autre.

Linux:

 /sbin/ip addr show eth0 | awk -F"[ /]+" '/inet / {print $3}' 

> = Solaris 11:

 ipadm show-addr net0/v4 | awk -F"[ /]+" '/ok/ {print $5}' 

Mac OS X / Darwin:

 ipconfig getifaddr en0 

Même le plus petit dénominateur commun et l'utilisation de ifconfig ne seront pas cohérents car le format de sortie peut changer. Cependant, pour nettoyer votre exemple, utilisez ceci:

 ifconfig eth0 | awk -F"[ :]+" '/inet / {print $4}' 

Si vous utilisez un langage plus sophistiqué comme perl, ruby, java, etc., au lieu du shell, chaque langue aura son propre moyen d'get ces données à partir du kernel. Je vais vous find cela à vous.

Toutes les réponses sont techniquement correctes, mais ce n'est pas ce que je considère comme la bonne réponse. Malheureusement, votre question est extrêmement vague (ce que je peux comprendre si vous ne savez pas vraiment comment fonctionne le travail en réseau sur linux). Je vais donc donner quelques réponses aux interprétations possibles de la question.

L'IP primaire de la machine

La machine a une adresse IP au dessus de toutes les autres qui sont considérées comme les machines IP primaires. Notez cependant que cela n'a pas de sens, car une boîte peut avoir plusieurs adresses IP et que l'on s'habitue varie (je vais y entrer un peu).

L'IP primaire est simplement l'IP associée au nom d'hôte de la machine. Vous pouvez find cette IP en exécutant ce qui suit

 getent hosts "$(hostname)" | awk '{ print $1 }' 

Maintenant, il vérifie l'adresse IP du nom d'hôte de la machine en fonction de /etc/nsswitch.conf . Dans la plupart des cas, le file /etc/nsswitch.conf contient des hosts: files dns . Cela signifie que lorsque vous essayez d'effectuer une search de nom d'hôte ou d'adresse, il va d'abord apparaître dans /etc/hosts , puis consulter DNS (tel que configuré par /etc/resolv.conf ).
Ainsi, la command getent hosts "$(hostname)" saisira probablement l'input correspondante de /etc/hosts . Le awk simplement saisit simplement l'IP de cette ligne.

( getent est juste un utilitaire simple pour interroger les «bases de données» listées dans /etc/nsswitch.conf )

L'IP utilisé pour communiquer avec le monde extérieur

Comme je l'ai mentionné plus tôt, l'IP primaire de la machine n'a pas vraiment de sens. La machine peut utiliser n'importe lequel des multiples IP pour la communication. Dans votre cas, vous n'avez probablement qu'une interface et une adresse IP (non localhost). Cependant, un server peut avoir plusieurs interfaces ou adresses IP (parfois plusieurs adresses IP sur une même interface).
L'adresse IP utilisée est déterminée par la table de routing du kernel. Je ne vais pas entrer dans les détails du fonctionnement de la table de routing, car ce n'est pas simple (il y a plusieurs tables de routing et celle qui est utilisée dépend des règles de sélection des tables). Je vais juste vous dire comment find quelle IP serait utilisée.

Pour savoir quelle adresse IP sera utilisée pour communiquer avec une destination spécifique, utilisez la command suivante:

 ip route get 1.2.3.4 

( 1.2.3.4 étant l'adresse IP de la destination)

Sur ma machine, si je le fais avec l'une des adresses IP de google.com ( 74.125.139.102 ), j'obtiens ce qui suit:

 74.125.139.102 via 192.168.0.1 dev wlan0 src 192.168.0.24 cache 

Qu'est-ce que cela me dit est que l'IP 192.168.0.24 sera utilisé chaque fois que ma machine va parler à 74.125.139.102 .

Si vous voulez juste l'IP, vous pouvez simplement lancer un grep supplémentaire à la fin.

 ip route get 1.2.3.4 | grep -oP '(?<=src )\S+' 

grep est utilisé à la place d'un awk car il est less sujet aux erreurs. Il est possible que la ligne change dans laquelle l'adresse IP ne sera pas au même endroit, mais elle suivra toujours "src", donc nous attrapons juste la valeur immédiatement après "src"

IP de la passerelle par défaut

Enfin, il y a la passerelle par défaut. Si vous n'avez pas de destination spécifique à interroger pour voir quelle adresse IP sera utilisée, vous pouvez choisir celle de la passerelle par défaut. Si vous n'avez qu'une seule interface, c'est tout ce qui count.
C'est fondamentalement la même chose que ci-dessus, en utilisant simplement la passerelle par défaut comme notre destination à searchr

 ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')" 

Cela vous donnera une ligne comme celle de la section ci-dessus. La valeur src est l'adresse IP qui sera utilisée pour le trafic circulant dans la passerelle par défaut.

Comme dans la section précédente, pour get juste l'adresse IP, ajoutez un grep .

 ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')" | grep -oP '(?<=src )\S+' 

Votre request est ambiguos, généralement avec le mot "localhost" signifie que l'interface de bouclage et 127.0.0.1 est la réponse la plus commune et la bonne.

Ce qui vous manque, c'est:

  • le fait que chaque interface peut avoir une adresse IP différente, l'interface de bouclage est une interface réseau, tout comme votre carte Ethernet ou votre récepteur USB sans fil.
  • en conséquence, un seul PC ne possède pas une seule adresse IP, tout dépend de l'interface que vous envisagez et du nombre d'interfaces que vous utilisez sous votre operating system.

Vous êtes probablement intéressé par le sujet "Tables de routing du kernel" qui est un bon moyen de commencer à comprendre comment le kernel gère votre activité de réseau.