46 votes

Mettre l'adresse IP dans une variable bash. Existe-t-il un meilleur moyen

J'essaie de trouver un moyen court et robuste de mettre mon adresse IP dans une variable bash et je me demandais s'il existait un moyen plus facile de le faire. Voici comment je procède actuellement :

ip=`ifconfig|xargs|awk '{print $7}'|sed -e 's/[a-z]*:/''/'`

0 votes

Comment avez-vous ajouté les backticks ?

4 votes

Si vous mettez 4 espaces avant la ligne, c'est considéré comme du code, et les backticks ne sont pas traités

3voto

John Springer Points 31

Ce qui suit fonctionne sur Mac OS (où il n'y a pas de commande ip ou d'options de nom d'hôte) :

#!/bin/bash

#get interface used for defalt route (usually en0)
IF=$(route get default |grep 'interface' |awk -F: '{print $2}');

#get the IP address for inteface IF
#does ifconfig, greps for interface plus 5 lines, greps for line with 'inet '
IP=$(ifconfig |grep -A5 $IF | grep 'inet ' | cut -d: -f2 |awk '{print $2}');
#get the gateway for the default route
GW=$(route get default | awk '/gateway:/ {print $2}');

2voto

caligari Points 897

J'utilise

IFACE='eth0'
IP=$(ip -4 address show $IFACE | grep 'inet' | sed 's/.*inet \([0-9\.]\+\).*/\1/')

L'avantage de cette méthode est de spécifier l'interface (variable IFACE dans l'exemple) au cas où vous utilisez plusieurs interfaces sur votre hôte.

En outre, vous pouvez modifier commande ip afin d'adapter ce snippet à votre convenance (adresse IPv6, etc.).

2voto

MortezaLSC Points 1857

Je pense que la réponse la plus fiable est :

ifconfig  | grep 'inet addr:' | grep -v '127.0.0.1' | awk -F: '{print $2}' | awk '{print $1}' | head -1

ET

hostname  -I | awk -F" " '{print $1}'

parce que lorsque vous n'utilisez pas head -1 il montre tous les ips....

2voto

Demon Points 11

Dans mon script, je n'avais besoin que de la partie réseau de l'IP, alors j'ai fait comme ça

local=$(hostname -I | awk '{print $2}' | cut -f1,2,3 -d".")

Où la coupe -f1,2,3 -d "." peut être lue comme "obtenir les 3 premières parties séparées par des virgules". Pour changer d'interface, il suffit de remplacer $2 par le numéro de votre interface, pour obtenir l'IP complète, il faut enlever cut.

1voto

user2734438 Points 11

En essayant d'éviter trop de tuyaux, de travailler sur différents linux, de définir un code de sortie, et d'éviter ifconfig ou d'autres paquets, j'ai essayé le tout en awk :

 ip addr show | awk '
     BEGIN {FS="/"}
     /^[0-9]+: eth[0-9]+.*UP*/ {ss=1}
     ss==1 && /^ +inet / {print substr($1,10); exit 0}
     END {exit 1}'

et notez qu'une interface particulière peut être spécifiée après "ip addr show" si vous ne voulez pas seulement la première interface eth. Et l'adaptation à ipv6 est une question de recherche de "inet6" au lieu de "inet"...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X