web-dev-qa-db-fra.com

Affichage de l'adresse IP sur l'interface eth0

Comment puis-je afficher l'adresse IP indiquée sur eth0 à l'aide d'un script?

18
user43389

enregistrez ceci dans un fichier puis exécutez bash <filename>

#!/bin/bash
ifconfig eth0 | grep "inet addr"

être plus précis pour obtenir uniquement le numéro indiquant l'adresse IP:

#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1

Mise à jour : Si cela ne fonctionne pas pour vous, essayez la autre réponse

26
Edward Torvalds

Afin de fournir une autre option, vous pouvez utiliser la commande ip addr de cette façon pour obtenir l'adresse IP:

ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
  • ip addr show eth0 affiche des informations sur eth0
  • grep "inet\b" montre seulement la ligne qui a l'adresse IPv4 (si vous voulez l'adresse IPv6, changez la en "inet6\b")
  • awk '{print $2}' imprime sur le deuxième champ, qui a l'adresse/masque, exemple 172.20.20.15/25
  • cut -d/ -f1 ne prend que la partie adresse IP.

Dans un script:

#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
21
Alaa Ali

Tiré de https://stackoverflow.com/a/14910952/169568

hostname -i

Cependant, cela peut renvoyer une adresse IP locale (127.0.0.1), vous devrez donc peut-être utiliser et filtrer:

hostname -I

Depuis les pages de manuel du nom d'hôte:

-i, --ip-address

Affiche la ou les adresses réseau du nom d'hôte. Notez que cela ne fonctionne que si le nom d'hôte peut être résolu. Évitez d'utiliser cette option. utilisez plutôt le nom d'hôte --all-ip-adresses.

-I, --all-ip-addresses

Affiche toutes les adresses réseau de l'hôte. Cette option énumère toutes les adresses configurées sur toutes les interfaces réseau. L'interface de bouclage et les adresses IPv6 link-local sont omises. Contrairement à l'option -i, cette option ne dépend pas de la résolution de nom. Ne faites aucune hypothèse sur l'ordre de la sortie.

17
ThorSummoner

La réponse de @ markus-lindberg est ma préférée. Si vous ajoutez -o -4 aux drapeaux de l'ip, vous obtenez une sortie beaucoup plus facilement analysable (et cohérente):

ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'

-o signifie --oneline, ce qui est conçu pour aider exactement dans ce genre de situation. Le -4 est ajouté pour limiter l'adresse IPv4, ce que toutes les autres réponses impliquent.

4
Amos Shapira

Voici quelques oneliners .....

Awk

ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'

la fonction split de la commande awk ci-dessus divise la deuxième colonne en fonction du délimiteur : et stocke la valeur fractionnée dans un tableau associatif a. Donc, a[2] contient la valeur de la deuxième partie.

sed

ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'

Dans sed de base, \(...\) a appelé le groupe de capture utilisé pour capturer les caractères. Nous pourrions faire référence à ces personnages capturés par le biais de références en arrière. \([^[:space:]]\+\) capture n'importe quel caractère mais pas l'espace une ou plusieurs fois.

grep

ifconfig eth0 | grep -oP 'inet addr:\K\S+'

\K supprime les caractères précédemment correspondants de l'impression à la dernière et \S+ correspond à un ou plusieurs caractères autres que des espaces.

Perl

ifconfig eth0 | Perl -lane 'print $1 if /inet addr:(\S+)/'

Un ou plusieurs caractères autres que des espaces situés en regard de la chaîne inet addr: sont capturés. Enfin, nous imprimons ces caractères uniquement.

3
Avinash Raj

Vous devez utiliser ip (au lieu de ifconfig), car il est actuel, maintenu et peut-être plus important encore pour les scripts, il produit une sortie cohérente et analysable. Voici quelques approches similaires:

Si vous voulez l'adresse IPv4 de votre interface Ethernet eth0:

$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24  

En tant que script:

$ INTFC=eth0  
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}') 
$ echo $MYIPV4
192.168.1.166/24

La sortie produite ci-dessus est en notation CIDR. Si la notation CIDR n'est pas souhaitée, elle peut être supprimée:

$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1 
192.168.1.166  

Une autre option, à mon humble avis, qui est "la plus élégante", consiste à obtenir l'adresse IPv4 de l'interface utilisée pour se connecter à l'hôte distant spécifié (8.8.8.8 dans ce cas). Avec l'aimable autorisation de @gatoatigrado in this answer :

$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166

En tant que script:

$ RHOST=8.8.8.8  
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166

Cela fonctionne parfaitement sur un hôte avec une seule interface, mais plus avantageusement, il fonctionne également sur des hôtes avec plusieurs interfaces et/ou spécifications de route.

ip serait mon approche préférée, mais ce n’est certainement pas le seul moyen de dépouiller ce chat. Voici une autre approche qui utilise hostname si vous préférez quelque chose de plus facile/plus concis:

$ hostname --all-ip-addresses | awk '{print $1}'  

Ou, si vous voulez l'adresse IPv6:

$ hostname --all-ip-addresses | awk '{print $2}'  

En tant que script:

$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}') 
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166 
$ echo $MYV6IP 
2601:7c1:103:b27:352e:e151:c7d8:3379
1
Seamus

ifconfig eth0|grep 'inet '|awk '{print $2}'

1
Maksim Kostromin
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

Ceci utilise uniquement ip addr, qui remplace ifconfig et awk, associé à une substitution (gsub).

Arrêtez d'utiliser trop de processus pour des tâches simples

1
Markus Lindberg

Je suggère d'utiliser une bibliothèque python telle que netifaces spécialement conçue à cet effet.

Sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"

Pour obtenir l'interface réseau par défaut utilisée.

default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]
1
Sandeep

Juste une option supplémentaire qui peut être utile si vous n’avez pas awk (comme c’est le cas sur certains appareils embarqués):

ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"
1
Fulvio Flaco

voici pour IPv4:

ip -f inet a|grep -oP "(?<=inet ).+(?=\/)"

voici pour IPv4 & particular dev (eth0):

ip -f inet a show eth0|grep -oP "(?<=inet ).+(?=\/)"

pour IPv6:

ip -6 -o a|grep -oP "(?<=inet6 ).+(?=\/)"

1
XXL

En voici une bonne, utilise seulement grep en tant que commande secondaire:

ip addr show eth0 | grep -oP 'inet\K\S [0-9.] +'

Je ne vois pas pourquoi vous devriez utiliser plus de commandes que nécessaire

1
Rick

cela peut aussi être utilisé avec un utilisateur normal.

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
0
Matheus Baldasso

C'est le moyen le plus court que j'ai pu trouver:

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

Remplacez $1 par votre interface réseau.

ip -f inet indique à ip de ne renvoyer que les valeurs de la famille inet (ipv4).

grep -Po indique à grep d'interpréter la valeur suivante sous la forme d'une expression rationnelle Perl et d'imprimer uniquement les valeurs correspondantes.

La regex \K[\d.]+ indique "jetez tout jusqu'à ce point (\ K) et correspondez à autant de valeurs numériques suivies d'un point dans une ligne" ". Cela correspondra donc uniquement à l'adresse IP et ignorera tout ce qui suit, y compris le masque de sous-réseau\XX court.

0
Ryan

de nos jours avec plusieurs interfaces (par exemple si vous utilisez un menu fixe) et l'interface de nommage par ETH n'est plus la norme

J'utilise cette commande pour extraire l'IP/Mask:

IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)

Ainsi, quels que soient le nombre d'interfaces que j'aurai et leur nom, GREP n'acceptera que la première disposant de l'option MULTICAST.

J'utilise cette commande pour extraire uniquement l'adresse IP sans le masque:

IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)

J'utilise ces commandes sur différents BDS et NIX, cela n'échoue jamais;)

0
JOduMonT

Dans mon script, j'utilise quelque chose comme ça:

re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
    echo ${BASH_REMATCH[1]}
else
    echo "Cannot determin IP" 1>&2
fi

Cela ne déclenche aucun processus.

0