46 votes

Mettre l'adresse IP dans une variable bash. Existe-t-il un meilleur moyen

J'essaie de trouver un moyen court et robuste de mettre mon adresse IP dans une variable bash et je me demandais s'il existait un moyen plus facile de le faire. Voici comment je procède actuellement :

ip=`ifconfig|xargs|awk '{print $7}'|sed -e 's/[a-z]*:/''/'`

0 votes

Comment avez-vous ajouté les backticks ?

4 votes

Si vous mettez 4 espaces avant la ligne, c'est considéré comme du code, et les backticks ne sont pas traités

11voto

Jotne Points 15088

Voici la meilleure façon d'obtenir l'adresse IP d'un appareil dans une variable :

ip=$(ip route get 8.8.8.8 | awk 'NR==1 {print $NF}')

NB Mise à jour pour supporter la nouvelle version de Linux. (fonctionne aussi avec les anciennes)

ip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}')

Pourquoi est-ce le meilleur ?

  1. Hostname -I Parfois, je n'obtiens que l'IP ou, comme sur mon VPS, j'obtiens 127.0.0.2 143.127.52.130 2a00:dee0:ed3:83:245:70:fc12:d196
  2. Hostnmae -I ne fonctionne pas sur tous les systèmes.
  3. Utilisation de ifconfig ne donne pas toujours l'IP que vous souhaitez.
    a. Il échouera si vous avez plusieurs interfaces (wifi/etcernet) etc.
    b. L'IP principale peut ne pas être sur la première interface trouvée.
  4. Recherche de eth0 peut échouer si l'interface a un autre nom comme dans VPS ou wifi

    ip route get 8.8.8.8

Tente d'obtenir une route et une interface vers le serveur DNS de Google (n'ouvre aucune session).
Ensuite, il est facile d'obtenir le ip ou le nom de l'interface si vous le souhaitez.

Cela peut également être utilisé pour obtenir un ip l'adresse d'une interface vers un hôte sur un réseau multidimensionnel.

8voto

skatkatt Points 31

Ma version courte. Utile lorsque vous avez plusieurs interfaces et que vous voulez juste l'IP principale.

host `hostname` | awk '{print $4}'

5voto

glenn jackman Points 69748

Vous pouvez utiliser awk pour faire le parsing d'ifconfig :

ip=$(ifconfig | gawk '
    /^[a-z]/ {interface = $1}
    interface == "eth0" && match($0, /^.*inet addr:([.0-9]+)/, a) {
        print a[1]
        exit
    }
')

4voto

gpojd Points 12043

Pas vraiment plus court ou plus simple, mais ça marche pour moi :

ip=$(ip addr show eth0 | grep -o 'inet [0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' | grep -o [0-9].*)

3voto

Jake Points 370
ifconfig | grep -oP "(?<=inet addr:).*?(?=  Bcast)"

Lorsque vous utilisez grep pour extraire une partie d'une ligne (comme le font certaines autres réponses), les assertions perl look-ahead et look-behind sont vos amies.

L'explication rapide est que le premier (?<=inet addr:) et enfin (?= Bcast) Les parenthèses contiennent des motifs qui doivent être recherchés, mais les caractères qui correspondent à ces motifs ne seront pas renvoyés par grep, seulement les caractères qui sont entre les deux modèles et faire correspondre le modèle .*? qui se trouve entre les jeux de parenthèses, sont retournés.

Exemple de sortie ifconfig :

eth0      Link encap:Ethernet  HWaddr d0:67:e5:3f:b7:d3  
          inet addr:10.0.0.114  Bcast:10.0.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1392392 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1197193 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1294730881 (1.2 GB)  TX bytes:167208753 (167.2 MB)
          Interrupt:18

Cela va extraire votre adresse IP de la sortie d'ifconfig :

ifconfig | grep -oP "(?<=inet addr:).*?(?=Bcast)"

Pour l'assigner à une variable, utilisez ceci :

ip=$(ifconfig | grep -oP "(?<=inet addr:).*?(?=Bcast)")

Une explication un peu plus approfondie :

De man grep :

-o Imprimer seulement les parties correspondantes (non vides) des lignes correspondantes, avec chacune de ces parties sur une ligne de sortie séparée.

-P Interpréter le motif comme une expression régulière Perl. Ceci est hautement expérimental et 'grep -P' peut signaler des fonctionnalités non implémentées.

De permonks.org :

(?<=pattern) est une assertion positive de type look-behind

(?=pattern) est une assertion positive de look-ahead

-o Indique à grep de ne retourner que la partie de la ligne qui correspond au motif. Les look-behinds/aheads ne sont pas considérés par grep comme faisant partie du motif qui est retourné. L'adresse ? après .* est important car nous voulons qu'il recherche le prochain look-ahead après la correspondance du motif .*, et non le dernier look-ahead. (Ce n'est pas nécessaire si nous avons ajouté une regex pour l'adresse IP au lieu de .*, mais, la lisibilité).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X