Réponses:
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
grep "inet"
Pour fournir une autre option, vous pouvez utiliser la ip addr
commande 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)
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.
ip addr show label 'enp*'
ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
La réponse de @ markus-lindberg est ma préférée. Si vous ajoutez -o -4
aux drapeaux IP, vous obtenez une sortie beaucoup plus facilement analysable (et cohérente):
ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'
-o
représente --oneline
ce qui est censé aider exactement dans ce genre de situations. Le -4
est ajouté pour limiter l'adresse IPv4, ce que toutes les autres réponses impliquent.
ip
drapeaux. Utiliser cut
la awk
magie plutôt que la magie avancée :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
cut
bien après avoir appris awk
, et j'aime minimiser le nombre de commandes sur mes pipelines. Belle suggestion en tout cas.
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+'
\K
supprime 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.
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 ip
ce 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 hostname
si 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
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]
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
Cette seule utilisation ip addr
qui est un remplacement ifconfig
et awk
combiné avec la substitution (gsub).
Arrêtez d'utiliser trop de processus pour des tâches simples
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}"
ifconfig eth0|grep 'inet '|awk '{print $2}'
cela peut également être utilisé avec un utilisateur normal.
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
deux fois au lieu d'une combinaison de awk
et cut
pour 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.
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'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.
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;)
ip
, utilisez l' -o
option.
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.