11
votes

Façon efficace d'obtenir votre adresse IP dans les scripts shell

contexte: Sur * NIX Systems, on peut obtenir l'adresse IP de la machine dans un script shell de cette façon: xxx

ou tel aussi: xxx < p> question: S'il y aurait un moyen plus simple, toujours portable, d'obtenir l'adresse IP pour une utilisation dans un script shell?

( Mes excuses à * BSD et Solaris utilisateurs, comme la commande ci-dessus peut ne pas fonctionner ; je n'ai pas pu tester) < / p>


3 commentaires

Et si la machine a plus d'une carte réseau?


Qu'entendez-vous par «l'adresse IP»? Il est très courant de nos jours d'avoir deux adresses IP ou plus, même sur un poste de travail ...


Oui, j'ai pensé à cette question. Mais cela dépend de ce que les scripts doivent faire. Pour mes besoins individuels, je passe habituellement le nom d'interface sur ifconfig (i.e ifconfig eth0 , etc.). Je pensais que cela rendrait la question trop spécifique. Toute suggestion comment rendre la question plus significative alors? Merci!


7 Réponses :


5
votes

Vous donnez une interface directe, réduisant ainsi un grep.

ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'


2 commentaires

Merci@coder pour la suggestion. Je me demande si nous ne pouvons même pas aller plus loin cependant! Après tout, les outils * Nix font quelque chose de simple et le font bien. Il peut donc y avoir un moyen standard d'obtenir l'adresse IP d'une interface. Par exemple, quelque chose comme hostname --ip-adresse (cela ne fonctionne pas) serait génial.


ifconfigthh0 | grep inet | Cut -D: -F2 | Cut -D '' -F1 - De cette façon, vous supprimez Awkwewewewewewewewwk. Bien sûr, ne fonctionnera pas avec PPP0, etc., mais si vous avez plus d'une carte réseau, vous obtiendrez également plus d'une réponse avec votre solution. (tête -1 à saisir en premier?)




12
votes

Vous pouvez le faire avec une seule commande AWK. Pas besoin d'utiliser trop de tuyaux.

$ ifconfig | awk -F':' '/inet addr/&&!/127.0.0.1/{split($2,_," ");print _[1]}'


3 commentaires

Votre proposition est très bien. Des tests simples montrent qu'il est également plus rapide en moyenne que mes propositions de base. Je voudrais accepter le vôtre pour l'instant. La portabilité n'est pas meilleure, en raison de _ [1] et 2 $ . Par exemple, je dois changer les indices sous * BSDS (AH, pourrait le tester cette fois). Honnêtement, je me demande toujours s'il y a un outil pour obtenir la propriété intellectuelle en un coup, peut-être des paramètres de passage (par exemple le nom de l'interface). ifconfig est en effet "Configurer les paramètres d'interface réseau", pas obtenir des paramètres ... peut-être une version bien répandue de showIp.c , comme introduit par Tom, serait génial .


Si vous souhaitez envisager la portabilité, vous voudrez peut-être essayer d'utiliser une bibliothèque de socket à partir des différents outils de programmation, tels que Perl ou Python. Par exemple, dans Python, on peut obtenir l'adresse IP à l'aide de socket.gethostbyname (socket.gethostName ()) . Bien sûr, c'est juste un exemple simple. Beaucoup de gens sont proposés avec la plate-forme des méthodes indépendantes de la liste d'adresses d'interface à l'aide de ces bibliothèques. Donc, vous voudrez peut-être essayer.


Le dernier commentaire de GhostDob74 m'a donné l'idée suivante: ifconfig | grep -op "\ b \ d {1,3} \. \ d {1,3} \. \ d {1,3} \. \ d {1,3} \ b" c'est très Portable, comme il se fusionne uniquement sur des outils standard et ne supporte aucune hypothèse sur la position de l'adresse IP dans les lignes analysées. Remarque: la regex capture de mauvaises adresses IP, mais cela n'a pas beaucoup donné que ifconfig renvoie des adresses valides.



0
votes

ifconfig | grep 'Broadcast \ | biccast' | awk -f '' {'print 2'} | tête-n ° 1 | Sed -e 's / addr: // g'


0 commentaires

0
votes

Peut-être que cela pourrait aider.

 more /etc/hosts | grep `hostname` | awk '{print $1}'


3 commentaires

Cela aiderait à spécifier au moins les conditions où vous pensez que ce travail (OS, etc.). Le grep est trop restrictif pour moi (testé sur deux OSES, sans succès).


J'ai testé dans les serveurs Aix. Fonctionne bien.


Il n'a pas fonctionné sur Centos et Mac OS X. Je ne connais pas suffisamment de normes, mais je me demande comment régulier le contenu du fichier / etc / etc. / hôte> est entre les systèmes.



0
votes
# for bash/linux
ipaddr(){
if="${1:-eth0}"
result=$(/sbin/ip -o -4 addr show dev "${if}" | sed 's/^.*inet // ; s/\/...*$//')
printf %s "${result}"
tty -s  && printf "\n"
}

0 commentaires

3
votes

basé sur Ce Vous pouvez utiliser la commande suivante

ip route get 8.8.8.8 | awk 'NR==1 {print $NF}'


0 commentaires