GNU/Linux >> Tutoriels Linux >  >> Linux

IP de l'hôte local

Il y a un défaut fondamental dans votre question. Premièrement, 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é à l'échelle mondiale est au moins 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 en utilisant le plus petit dénominateur commun et en utilisant ifconfig ne sera pas cohérent 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 langage aura sa propre façon d'obtenir ces données du noyau. Je vous laisse trouver ça.


Les informations peuvent changer à tout moment, elles doivent donc être récupérées depuis le noyau, elles ne peuvent pas être stockées dans un fichier.

Il n'y a pas vraiment de moyen agréable d'obtenir ces informations. Votre analyse est aussi bonne que n'importe quelle autre, sauf que le codage en dur de la deuxième ligne est erroné :il n'y a aucune garantie que les interfaces seront répertoriées dans un ordre particulier. Il est assez courant qu'une machine ait plus d'une interface :vous pouvez avoir plusieurs cartes réseau ou interfaces virtuelles.

Souvent, l'adresse IP qui vous intéresse est celle associée à la route par défaut. Avec la plupart des configurations, vous pouvez obtenir la bonne interface avec le route commande, puis extrayez 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 le sudo . ifconfig et route ne sont souvent pas dans le PATH par défaut pour les utilisateurs non root, mais vous pouvez les utiliser sans privilège spécial tant que vous ne faites que lire des informations et ne modifiez pas les paramètres.

Sur les variantes Unix autres que Linux, vous devrez peut-être modifier les commandes ci-dessus. La plupart ont des commandes 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 le ip commande de la suite d'outils iproute2. Alors que les auteurs d'iproute2 considèrent ifconfig et route être obsolète, il y a en fait peu d'avantages à utiliser ip , depuis la sortie de ip n'est pas nettement plus facile à analyser, et ifconfig et route sont toujours disponibles alors que certaines installations Linux simplifiées omettent ip .


Toutes les réponses ici sont techniquement correctes, mais elles ne sont pas ce que je considérerais comme la "bonne" réponse. Malheureusement, votre question est extrêmement vague (ce que je peux comprendre si vous n'êtes pas vraiment doué avec le fonctionnement de la mise en réseau sous Linux), je vais donc donner quelques réponses aux interprétations possibles de la question.


L'adresse IP principale de la machine

La machine a une adresse IP au-dessus de toutes les autres, qui est considérée comme l'adresse IP principale de la machine. Notez cependant que cela n'a pas beaucoup de sens, car une boîte peut avoir plusieurs adresses IP et celle qui est utilisée varie (j'y reviendrai un peu).

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

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

Maintenant, ce que cela fait est de rechercher l'IP pour le nom d'hôte de la machine selon /etc/nsswitch.conf . Dans la plupart des cas, le /etc/nsswitch.conf le fichier contient hosts: files dns . Cela signifie que lorsque vous essayez de faire n'importe quelle sorte de recherche de nom d'hôte ou d'adresse, il cherchera dans /etc/hosts d'abord, puis consultez le DNS (tel que configuré par /etc/resolv.conf ).
Donc la commande getent hosts "$(hostname)" saisira probablement l'entrée correspondante de /etc/hosts . Le awk récupère simplement l'adresse IP de cette ligne.

(getent est juste un simple utilitaire pour interroger les 'bases de données' répertoriées dans /etc/nsswitch.conf )


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

Comme je l'ai mentionné plus tôt, l'adresse IP principale de la machine n'a pas beaucoup de sens. La machine peut utiliser n'importe laquelle de plusieurs adresses IP pour la communication. Dans votre cas, vous n'avez probablement qu'une seule interface et une seule adresse IP (non locale). Cependant, un serveur peut avoir plusieurs interfaces ou adresses IP (parfois plusieurs adresses IP sur une seule interface).
L'adresse IP utilisée est déterminée par la table de routage du noyau. Je ne vais pas entrer dans les détails du fonctionnement de la table de routage car ce n'est pas simple (il existe plusieurs tables de routage, et celle qui est utilisée dépend des règles de sélection de table). Je vais juste vous dire comment trouver quelle adresse IP serait utilisée.

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

ip route get 1.2.3.4

(avec 1.2.3.4 étant l'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 ceci :

74.125.139.102 via 192.168.0.1 dev wlan0  src 192.168.0.24 
    cache 

Ce que cela me dit, c'est que l'IP 192.168.0.24 sera utilisé chaque fois que ma machine parlera au 74.125.139.102 .

Si vous voulez juste l'adresse IP, vous pouvez simplement jeter 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 moins sujet aux erreurs. Il est possible que la ligne change dans laquelle l'IP ne sera pas au même endroit, mais elle suivra toujours "src", donc nous saisissons 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 compte de toute façon.
C'est fondamentalement la même chose que ci-dessus, en utilisant simplement la passerelle par défaut comme destination pour rechercher

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. Le src la valeur est l'IP qui sera utilisée pour le trafic passant par la passerelle par défaut.

Comme dans la section précédente, pour obtenir uniquement l'IP, ajoutez un grep .

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

Linux
  1. Mon kit de survie d'administrateur système Linux

  2. Avez-vous déjà racké un serveur ?

  3. Exécuter une ligne de commandes avec One Sudo ?

  4. Rechercher -exec + Vs Rechercher | Xargs :lequel choisir ?

  5. Cryptage Ubuntu One ??

Qu'est-ce que l'hôte local 127.0.0.1 ?

[Bash Tips] Comment cd et ls en une seule commande

[Bash Tips] Comment cp ou mv et cd en une seule commande

Qu'est-ce que Localhost ?

Créer un lien symbolique - Écraser s'il en existe un ?

Panneau d'unité ?