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+'