2010-03-02 2 views
11

Contexte: sur les systèmes * nix, on peut obtenir l'adresse IP de la machine dans un script shell ainsi:façon efficace pour obtenir votre adresse IP dans les scripts shell

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

Ou cette façon aussi :

ifconfig | grep 'inet' | grep -v '127.0.0.1' | awk '{print $2}' | sed 's/addr://' 

question: y aurait-il un moyen plus simple, encore portable, pour obtenir l'adresse IP utilisée dans un script shell?

(my apologies to *BSD and Solaris users as the above command may not work, je ne pouvais pas tester)

+2

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

+1

Que voulez-vous dire par "l'adresse IP"? Il est très fréquent de nos jours d'avoir deux adresses IP ou plus, même sur un poste de travail ... –

+0

Oui, j'ai réfléchi à ce problème. Mais cela dépend de ce que les scripts doivent faire. Pour mes besoins individuels, je passe généralement le nom de l'interface à ifconfig (c'est-à-dire 'ifconfig eth0', etc.). Je pensais que cela rendrait la question trop spécifique. Toute suggestion comment rendre la question plus significative alors? Merci! –

Répondre

12

vous pouvez le faire avec juste une commande awk. Pas besoin d'utiliser trop de tuyaux.

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

+1, mais les espaces ne sont pas en danger: utilisez plus –

+0

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 le moment. La portabilité n'est toutefois pas meilleure grâce à '_ [1]' et '$ 2'. Par exemple, j'ai besoin de changer les indices sous * BSD (ah, pourrait le tester cette fois). Honnêtement, je me demande toujours s'il existe un outil pour obtenir l'IP en une seule fois, peut-être en passant des paramètres (par exemple le nom de l'interface). 'ifconfig' est en effet de" configurer les paramètres de l'interface réseau ", pas de paramètres ... Peut-être une version bien répandue de' showip.c', telle que présentée par Tom, serait géniale. –

+1

Si vous souhaitez prendre en compte la portabilité, vous pouvez essayer d'utiliser une bibliothèque de socket à partir des différents outils de programmation existants, tels que Perl ou Python. Par exemple, en Python, on peut obtenir l'adresse IP en utilisant 'socket.gethostbyname (socket.gethostname())'. Bien sûr, ce n'est qu'un exemple simple. Beaucoup de gens ont trouvé des façons indépendantes de la plate-forme de répertorier l'adresse de l'interface en utilisant ces bibliothèques. donc vous pourriez vouloir essayer. – ghostdog74

5

vous donne une interface directe réduisant ainsi un grep.

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

Merci @coder pour la suggestion. Je me demande si nous ne pouvons pas aller encore 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-address' (ça ne marche pas) serait génial. –

+0

'ifconfig eth0 | grep inet | couper -d: -f2 | couper -d '' -f1' - de cette façon vous éliminez le poids lourd awk. Bien sûr, cela ne fonctionnera pas avec ppp0 etc, mais si vous avez plus d'un NIC, vous obtiendrez plus d'une réponse avec votre solution. (tête -1 pour saisir en premier?) –

+0

Cela a fonctionné, et plus court que les autres réponses. – Quanlong

1

Regardez ici au guide networking du Beej pour obtenir la liste des prises en utilisant un programme simple C pour imprimer les adresses IP à l'aide getaddrinfo(...) appel. Ce programme C simple peut être utilisé dans une partie du script shell pour simplement imprimer les adresses IP disponibles à stdout ce qui serait plus facile à faire, puis compter sur le ifconfig si vous voulez rester portable car la sortie de ifconfig peut varier.

Espérons que cela aide, Cordialement, Tom.

+0

Merci Tom pour le pointeur; ça aide. Une mine d'informations. Le 'showip.c' résout le problème (en supprimant le formatage en sortie).Je me demande s'il existe un moyen de s'appuyer sur des outils "standard" * nix dans les shells. Pour le contexte, j'écris des scripts qui sont supposés fonctionner sur * nix et * BSD. Cela fonctionne, mais mon chemin n'est pas très élégant. En utilisant 'showip.c', j'aurais besoin de déployer le programme avec le script, ce qui pourrait être évité. –

0

ifconfig | grep 'broadcast \ | Bcast' | awk -F '' {'print $ 2'} | tête -n 1 | sed -e 's/addr: // g'

0

Peut être cela pourrait aider.

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

Il serait utile de spécifier au moins les conditions dans lesquelles vous pensez que ce travail (système d'exploitation, etc). Le 'grep' est trop restrictif pour moi (testé sur deux systèmes d'exploitation, sans succès). –

+0

J'ai testé sur des serveurs AIX. Fonctionne bien. –

+0

Cela ne fonctionnait pas sur CentOS et Mac OS X. Je ne connais pas assez les standards, mais je me demande à quel point le contenu du fichier '/ etc/hosts' est régulier sur tous les systèmes. –

0
# 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" 
} 
2

Basé sur this vous pouvez utiliser la commande suivante

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