Comment puis-je afficher l'adresse IP indiquée sur eth0 à l'aide d'un script?
24
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
affiche des informations sureth0
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 exemple172.20.20.15/25
cut -d/ -f1
ne prend que la partie adresse IP.Dans un script:
la source
Tiré de /programming//a/14910952/1695680
Cependant, cela peut renvoyer une adresse IP locale (127.0.0.1), vous devrez donc peut-être utiliser et filtrer:
Depuis les pages de manuel du nom d'hôte:
la source
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):-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.la source
ip
drapeaux. Utilisercut
laawk
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 apprisawk
, et j'aime minimiser le nombre de commandes sur mes pipelines. Belle suggestion en tout cas.Voici quelques oneliners .....
Awk
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 associatifa
. Tient donca[2]
la valeur de la deuxième partie.sed
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
\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
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.la source
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
la source
Vous devez utiliser
ip
(au lieu deifconfig
) 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
:En tant que script:
La sortie produite ci-dessus est en notation CIDR. Si la notation CIDR n'est pas souhaitée, elle peut être supprimée:
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 :
En tant que script:
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 utilisehostname
si vous préférez quelque chose de plus simple / plus concis:Ou, si vous voulez l'adresse IPv6:
En tant que script:
la source
Je suggère d'utiliser une bibliothèque python comme netifaces spécialement conçue à cet effet.
Pour obtenir l'interface réseau par défaut en cours d'utilisation.
la source
Cette seule utilisation
ip addr
qui est un remplacementifconfig
etawk
combiné avec la substitution (gsub).Arrêtez d'utiliser trop de processus pour des tâches simples
la source
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):
la source
ifconfig eth0|grep 'inet '|awk '{print $2}'
la source
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 ).+(?=\/)"
la source
cela peut également être utilisé avec un utilisateur normal.
la source
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
deux fois au lieu d'une combinaison deawk
etcut
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.la source
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:
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:
J'utilise ces commandes sur différents BDS & NIX ça n'échoue jamais;)
la source
ip
, utilisez l'-o
option.Dans mon script, j'utilise quelque chose comme ça:
Il n'engendre aucun processus.
la source
Encore une autre façon (en supposant que vous ne voulez pas d'
CIDR
adresse et que vous voulezIPv4
):ip
commande qui n'est pasdeprecated
la source