Affichage de l'adresse IP sur l'interface eth0


24

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

Réponses:


28

enregistrez-le dans un fichier, puis exécutez bash <filename>

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

étant 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 l' autre réponse


2
bien sûr, cela ne fonctionne pas dans le dernier ubuntu. le dernier ifconfig retourne "inet <ip>" au lieu de "inet addr <ip>"
thang

vous pouvez simplement utilisergrep "inet"
Andrei Radulescu

26

Pour fournir une autre option, vous pouvez utiliser la ip addrcommande 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"affiche uniquement la ligne qui a l'adresse IPv4 (si vous vouliez l'adresse IPv6, changez-la en "inet6\b")
  • awk '{print $2}' imprime sur le deuxième champ, qui a l'adresse IP / le masque, par 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)

cette solution fonctionne réellement!
thang

ip -4 ... et ip -6 ...! Merci!
TamusJRoyce

17

Tiré de /programming//a/14910952/1695680

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

Affichez 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 hostname --all-ip-addresses.

-I, --all-ip-addresses

Affichez 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 de liaison locale 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 sortie.


pour la ip addr show label 'enp*'ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
petite

5

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

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

-oreprésente --onelinece qui est censé aider exactement dans ce genre de situations. Le -4est ajouté pour limiter l'adresse IPv4, ce que toutes les autres réponses impliquent.


J'adore les ipdrapeaux. Utiliser cutla awkmagie plutôt que la magie avancée :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
DuffJ

@DuffJ, c'est probablement une question de goût personnel. J'ai "découvert" cutbien après avoir appris awk, et j'aime minimiser le nombre de commandes sur mes pipelines. Belle suggestion en tout cas.
Amos Shapira

Je suis entièrement d'accord, Amos. Merci pour votre solution!
DuffJ

3

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. Tient donc a[2]la valeur de la deuxième partie.

sed

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

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

grep

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

\Ksupprime les caractères précédemment appariés de l'impression lors de la finale et \S+correspond à un ou plusieurs caractères non-espace.

Perl

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

Un ou plusieurs caractères non-espace qui sont à côté de la inet addr:chaîne sont capturés et finalement nous imprimons uniquement ces caractères capturés.


@edwardtorvalds a ajouté quelques explications. Je pense que cela serait utile pour les futurs lecteurs. N'hésitez pas à poser des questions à partir des commandes ci-dessus ... :)
Avinash Raj

2

En voici une bonne, utilise uniquement grep comme 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


2

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

Si vous souhaitez l'adresse IPv4 pour 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 que IMHO est "la plus élégante" obtient l'adresse IPv4 pour n'importe quelle interface utilisée pour se connecter à l'hôte distant spécifié (8.8.8.8 dans ce cas). Gracieuseté de @gatoatigrado dans cette réponse :

$ 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 bien sur un hôte avec une seule interface, mais plus avantageusement, cela fonctionnera également sur des hôtes avec plusieurs interfaces et / ou spécifications de route.

Bien que ipce soit mon approche préférée, ce n'est certainement pas le seul moyen d'écorcher ce chat. Voici une autre approche qui utilise hostnamesi vous préférez quelque chose de plus simple / 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

Je suggère d'utiliser une bibliothèque python comme 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 en cours d'utilisation.

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


1

Juste une option de plus qui peut être utile si vous n'avez pas awk (comme c'est le cas dans 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

voici pour IPv4 :

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

voici pour IPv4 et dev particulier (eth0):

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

pour IPv6 :

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


0

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

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

il demande eth0, cette version de votre script pourrait vous aider (montrez également le bouclage)ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
TiloBunt

C'est à peu près la même réponse que askubuntu.com/a/560466/367990 , en utilisant simplement cutdeux fois au lieu d'une combinaison de awket cutpour analyser la sortie. La prochaine fois, vous devriez d'abord vérifier toutes les autres réponses et vous assurer de ne pas publier de solution en double. Dans ce cas ici, je pense qu'il est discutable qu'il s'agisse d'un doublon ou tout simplement similaire, alors veuillez le prendre comme un indice général. Merci.
Byte Commander

0

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

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

Remplacez $1par 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'interpérer la valeur suivante en tant que perl-regex et d'afficher uniquement les valeurs correspondantes.

Le regex \K[\d.]+dit "jetez tout jusqu'à ce point (\ K), et faites correspondre autant de valeurs numériques suivies d'un point dans une rangée que possible". Cela ne correspondra donc qu'à l'adresse IP et ignorera tout ce qui se trouve après, y compris le masque de sous-réseau shortform \ XX.


0

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

J'utilise cette commande pour extraire l'IP / le masque:

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

Donc, quel que soit le nombre d'interfaces que j'aurai et quel que soit leur nom, GREP ne récupérera que la première ayant l'option MULTICAST.

J'utilise cette commande pour extraire uniquement l'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 & NIX ça n'échoue jamais;)


Si vous allez analyser la sortie de ip, utilisez l' -ooption.
muru

0

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

Il n'engendre aucun processus.


0

Encore une autre façon (en supposant que vous ne voulez pas d' CIDRadresse et que vous voulez IPv4):

$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
  • Utilise la ipcommande qui n'est pasdeprecated
  • Utilise une seule commande pour filtrer
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.