Comment puis-je afficher l'adresse IP indiquée sur eth0 à l'aide d'un script?
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
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)
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.
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.
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.
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
ifconfig eth0|grep 'inet '|awk '{print $2}'
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
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]
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}"
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 ).+(?=\/)"
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
cela peut aussi être utilisé avec un utilisateur normal.
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
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.
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;)
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.