web-dev-qa-db-fra.com

Script Linux bash pour extraire l'adresse IP

Je veux faire un gros script sur ma Debian 7.3 (quelque chose comme une traduction et beaucoup plus de nouvel environnement convivial). J'ai un problème. Je souhaite utiliser uniquement certaines des informations fournies par les commandes. Par exemple, mon ifconfig ressemble à:

eth0      Link encap:Ethernet  HWaddr 08:00:27:a3:e3:b0  
          inet addr:192.168.1.103  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fea3:e3b0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1904 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2002 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1309425 (1.2 MiB)  T

Je veux afficher uniquement l'adresse IP en ligne: echo "Votre adresse IP est: (IP_ADDRESS)". Existe-t-il une commande qui me permet de faire une telle chose, de rechercher dans le flux d’informations que je veux obtenir ?. Je connais grep et sed mais je ne suis pas très bon avec eux.

Edit: Tout d'abord, merci de m'avoir aidé à résoudre ce problème, maintenant j'en sais beaucoup plus. Deuxièmement, le projet est en cours. Si quelqu'un s'y intéressait, juste moi.

35
user3232381

Pour obtenir simplement votre adresse IP:

echo `ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'`

Cela vous donnera l'adresse IP de eth0.

Edit: En raison des changements de nom des interfaces dans les versions récentes d’Ubuntu, cela ne fonctionne plus. Au lieu de cela, vous pouvez simplement utiliser ceci:

hostname --all-ip-addresses ou hostname -I, qui fait la même chose (vous donne TOUTES les adresses IP de l'hôte).

35
Marco Hegenberg

Si le but est de trouver l'adresse IP connecté en direction d'Internet, alors cela devrait être une bonne solution.


MISE À JOUR!!! Avec la nouvelle version de linux, vous obtenez plus d’informations sur la ligne:

ip route get 8.8.8.8
8.8.8.8 via 10.36.15.1 dev ens160 src 10.36.15.150 uid 1002
    cache

donc pour obtenir une adresse IP, vous devez trouver l'adresse IP après src

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

et si vous aimez le nom de l'interface

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

ip route n'ouvre aucune connexion, il montre simplement l'itinéraire nécessaire pour se rendre à 8.8.8.8. 8.8.8.8 est le DNS de Google.

Si vous aimez stocker ceci dans une variable, faites:

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

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

Pourquoi une autre solution peut échouer:

ifconfig eth0

  • Si l'interface que vous avez a un autre nom (eno1, wifi, venet0, etc.)
  • Si vous avez plus d'une interface
  • La direction de connexion IP n'est pas la première dans une liste de plusieurs IF

Hostname -I

  • Peut n'obtenir que le 127.0.1.1
  • Ne fonctionne pas sur tous les systèmes.
81
Jotne

Si vous voulez obtenir une liste de vos adresses IP séparées par des espaces, vous pouvez utiliser la commande hostname avec le --all-ip-addresses (court -I) drapeau

hostname -I

comme décrit ici: Mettre l'adresse IP dans la variable bash. Existe-t-il un meilleur moyen ?

35
user000001
ip -4 addr show eth0 | grep -oP "(?<=inet ).*(?=/)"
7
John

Peut-être pas pour tous les cas (surtout si vous avez plusieurs NIC), ceci aidera:

hostname -I | awk '{ print $1 }'
5
Pavel
  /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
4
Tharanga Abeyseela
ip route get 8.8.8.8| grep src| sed 's/.*src \(.*\)$/\1/g'
4
fastrizwaan

Faites votre choix:

$ cat file
eth0      Link encap:Ethernet  HWaddr 08:00:27:a3:e3:b0
          inet addr:192.168.1.103  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fea3:e3b0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1904 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2002 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1309425 (1.2 MiB)  T

$ awk 'sub(/inet addr:/,""){print $1}' file
192.168.1.103

$ awk -F'[ :]+' '/inet addr/{print $4}' file
192.168.1.103
4
Ed Morton

Juste une note, puisque je viens de passer du temps à dépanner une mise à niveau bâclée sur un serveur. Il s’est avéré que j’avais mis en place un test pour vérifier si des interfaces ajoutées de manière dynamique (par exemple, eth0: 1) étaient présentes et, le cas échéant, je lierais certains proggis à l’IP "principale" sur eth0. En gros, il s'agissait d'une variante de la solution 'ifconfig | grep ... | sed ...' (plus la vérification de la présence de 'eth0:').
La mise à jour a apporté de nouveaux outils réseau et avec elle, la sortie a légèrement changé:

ancien ifconfig:

eth0      Link encap:Ethernet  HWaddr 42:01:0A:F0:B0:1D
          inet addr:10.240.176.29  Bcast:10.240.176.29  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          ...<SNIP>

alors que la nouvelle version affichera ceci:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1460
      inet 10.240.212.165  netmask 255.255.255.255  broadcast 10.240.212.165
      ...<SNIP>

rendant la recherche de 'eth0:' ainsi que de 'inet addr:' la recherche a échoué (peu importe les interfaces appelées 'em0', 'br0' ou 'wlan0' ...). Bien sûr, vous pouvez vérifier 'inet' (ou 'inet6'), et rendre l'adr: part optionnel, mais en regardant de plus près, vous verrez que plus ou moins tout a changé, 'Mask' est maintenant 'netmask', .. .

La suggestion 'ip route ...' est assez astucieuse - alors peut-être:

_MyIP="$( ip route get 8.8.8.8 | awk 'NR==1 {print $NF}' )"
if [ "A$_MyIP" == "A" ]
then
    _MyIPs="$( hostname -I )"
    for _MyIP in "$_MyIPs"
    do
        echo "Found IP: \"$_MyIP\""
    done
else
    echo "Found IP: $_MyIP"
fi

Eh bien, quelque chose de ce genre quand même. Dans la mesure où toutes les solutions proposées semblent échouer, vérifiez les cas Edge possibles - pas d’Eth, plusieurs eth & lo, quand "hostname -i" échouera, ... puis choisissez la meilleure solution, vérifiez que cela fonctionne, sinon 2e meilleur.

Cheers 'n' beers!

2
Kevin

Une légère modification à l'un des précédents ip route ... solutions, ce qui élimine le besoin d’un grep:

ip route get 8.8.8.8 | sed -n 's|^.*src \(.*\)$|\1|gp'
0
Doug R.

À mon avis, le moyen le plus simple et le plus élégant de réaliser ce dont vous avez besoin est le suivant:

ip route get 8.8.8.8 | tr -s ' ' | cut -d' ' -f7

ip route get [Host] - vous donne la passerelle utilisée pour atteindre un hôte distant, par exemple:

8.8.8.8 via 192.168.0.1 dev enp0s3  src 192.168.0.109

tr -s ' ' _ - supprime tous les espaces supplémentaires, vous avez maintenant l'uniformité, par exemple:

8.8.8.8 via 192.168.0.1 dev enp0s3 src 192.168.0.109

cut -d' ' -f7 - tronque la chaîne en '' champs séparés par des espaces, puis en sélectionne le champ n ° 7, par exemple:

192.168.0.109
0
leonarth
awk '/inet addr:/{gsub(/^.{5}/,"",$2); print $2}' file
192.168.1.103
0
Claes Wikner