web-dev-qa-db-fra.com

Existe-t-il un moyen simple d'extraire par programme l'adresse IP?

Existe-t-il un moyen simple d'extraire une adresse IP par programme, sans analyse fastidieuse de ifconfig? Cela ne me dérangerait pas le traitement de sortie de commande simple utilisant sed pour le faire mais pas le traitement de fichiers multilignes à partir de /etc un endroit. Ce que j'essaie de faire, c'est de modifier mon .bashrc pour afficher l'adresse IP de l'hôte dans le message d'accueil. J'utilise Ubuntu 12.04 mais j'ai décidé de poster ici au lieu du forum Ubuntu car je considère que ce n'est pas spécifique à la distribution.

43
amphibient

REMARQUES

  1. Poignées de périphériques NIC

    Les exemples ci-dessous supposent que l'interface réseau est une carte sans fil nommée wlan0. Ajustez ce bit dans les exemples pour votre situation particulière. Par exemple, s'il s'agit d'une carte câblée NIC, il est probable que eth0.

  2. IPv4 Internet Protocol version 4)

    Ces exemples renvoient également l'adresse IPv4. le "quadruple pointillé" que la plupart des gens identifient comme leur "adresse IP".

    Par exemple:

    inet addr:192.168.1.20  Bcast:192.168.1.255  Mask:255.255.255.0
    
  3. IPv6 - (Internet Protocol version 6)

    Si votre système est configuré pour prendre en charge IPv6, vous verrez à la fois le "quadrillé en pointillé" ainsi que les adresses IP IPv6 dans la sortie ifconfig.

    Par exemple:

    inet6 addr: fe80::226:c7ff:fe85:a720/64 Scope:Link
    

    Les commandes ci-dessous ignorent explicitement cela, mais pourraient être adaptées assez facilement pour saisir ces informations à la place.

Solutions (en utilisant ifconfig)

Il existe plusieurs façons de procéder. Vous pouvez par exemple utiliser ce script awk pour analyser l'adresse IP de votre LAN sans fil NIC (wlan0):

$ ifconfig wlan0 | grep "inet " | awk -F'[: ]+' '{ print $4 }'
192.168.1.20

Vous pouvez le faire et le rendre plus compact:

$ ifconfig wlan0 | awk '/t addr:/{gsub(/.*:/,"",$2);print$2}'
192.168.1.20

Vous pouvez également le faire en utilisant Perl:

$ ifconfig wlan0 | Perl -nle'/t addr:(\S+)/&&print$1'
192.168.1.20

L'exemple Perl est à peu près aussi compact que possible.

Il existe d'innombrables autres façons de le faire, ce ne sont que quelques exemples pour vous aider à démarrer.

EDIT # 1

Quelques notes et commentaires supplémentaires. @StephaneChazelas a démontré qu'il existe une version encore plus compacte utilisant grep:

$ ifconfig wlan0|grep -Po 't addr:\K[\d.]+'
192.168.1.20

Cette solution utilise la capacité de grep dans les versions plus récentes à utiliser PCRE (expressions régulières Perl), ainsi que son -o commutateur pour retourner exactement ce qui correspond à l'expression régulière.

Solutions (en utilisant ip)

Comme cela a également été mentionné dans les commentaires, ifconfig peut être gênant à utiliser sur des systèmes qui ont plusieurs adresses IP attribuées à un périphérique réseau, car il ne renvoie que la première. Il est donc préférable d'utiliser la commande ip dans ces situations.

Par exemple:

$ ip addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20

Vous pouvez également demander à ip de n'afficher que les informations IPv4 pour une interface réseau donnée. Dans ce cas, nous ne regardons que l'interface nommée wlan0:

$ ip -f inet addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20

Références

47
slm

$ hostname -I

Par exemple:

$ hostname -I
192.168.1.18

Info. à partir des pages de manuel:

http://manpages.ubuntu.com/manpages/raring/en/man1/hostname.1.html
http://unixhelp.ed.ac.uk/CGI/man-cgi?hostname

24
Robert Vila

En voici un autre utilisant "ip" mais cela fonctionne mieux lorsque votre appareil peut être connecté à différentes interfaces, comme Ethernet câblé parfois et WiFi à d'autres moments. J'ai également utilisé "sed" au lieu de "grep" ou "Perl", pour la variété.

Cela trouve toute IP source qui a une route vers Internet. Ou au DNS de Google en tout cas.

ip -o route get 8.8.8.8 | sed -e 's/^.* src \([^ ]*\) .*$/\1/'
7
Zan Lynx