Méthodes pour détecter l’adresse IP publique dans bash

Dans le cadre d’un script d’installation, je veux faire une “supposition éclairée” sur l’adresse IP publique de la machine. Il devrait être aussi robuste que possible, en travaillant sur une variété d’hôtes et de plates-formes. Voici un exemple:

https://gist.github.com/4669037

Ce script utilise 3 méthodes, puis utilise par défaut la valeur de /etc/hostname . Je l’ai seulement testé sur Ubuntu jusqu’à présent. Sera-t-il susceptible de fonctionner sur d’autres dissortingbutions? Et y a-t-il des méthodes supplémentaires que je pourrais append?

 curl ipinfo.io/ip 

Ou

 wget -qO- ipinfo.io/ip 

Ou

 lynx -source ipinfo.io/ip 

obtenir une adresse IP publique

curl ifconfig.me serait le meilleur choix, au cas où vous n’avez pas de boucle:

wget -qO- ifconfig.me/ip

Combien de public IP public recherchez-vous? Et si la machine est derrière le NAT?

  • curl / wget / netcat ( nc ) qui contient l’adresse du demandeur: doit fonctionner la plupart du temps, mais le site peut être inaccessible depuis la machine (que ce soit un pare-feu ou une indisponibilité temporaire / permanente). Vous obtiendrez l’adresse IP la plus publique possible.

  • ifconfig : doit être exécuté en tant que root, sinon vous devriez également essayer /sbin/ifconfig ou /usr/sbin/ifconfig . Que se passe-t-il si la machine a plus de cartes réseau? Comment dites-vous quelle adresse IP est la bonne? Que se passe-t-il si seul IPv6 est utilisé sur le LAN de la machine? Dans tous les cas, vous obtiendrez le moins d’IP publique possible (et peut-être une mauvaise si plusieurs interfaces sont configurées sur la machine – ce qui est souvent le cas aujourd’hui avec une virtualisation omniprésente utilisant des périphériques réseau et / ou).

  • /etc/hostname : il n’a pas besoin d’exister, sur de nombreux systèmes il s’agit de /etc/HOSTNAME , et il ne contient pas d’adresse IP, il devrait plutôt contenir le nom d’hôte (généralement le nom de domaine complet).

Le fait est que les manières dont il peut échouer sont nombreuses et vous devriez probablement envisager soit: a) de spécifier plus précisément quels systèmes vous ciblez, ou b) si vous avez vraiment besoin de connaître l’IP – est une solution qui semble travailler dans des cas simples qui valent la peine d’être utilisés lorsqu’il échoue lamentablement dans une configuration un peu plus compliquée? Si vous pensez avoir besoin de l’adresse IP, préparez-vous à gérer les échecs avec élégance dans les cas où vous ne recevez pas l’adresse IP du tout ou que vous ne parvenez pas à en obtenir une.

Cette solution ne fonctionne pas si vous êtes derrière nat ou quelque chose. Cela aide sans un service tiers. Cela fonctionne si la machine a la connexion, comme un serveur, ou une connexion ppp.

  • Pas une réponse exacte à la question, mais aide probablement d’autres personnes (comme moi)
  • Doit être racine dans la plupart des cas (ou tous?)

Vous pouvez obtenir la (première) route par défaut de route -n , trouver l’interface qu’elle utilise et trouver l’IP dont elle dispose.

 MAINIF=$( route -n | grep '^0\.0\.0\.0' | head -n 1 | awk '{print $NF}' ) IP=$( ifconfig $MAINIF | { IFS=' :';read r;read rrar;echo $a; } ) 

Essayez cette commande:

 wget -O - -q icanhazip.com 

Si sur un AWS EC2, vous pouvez utiliser:

 curl checkip.amazonaws.com 

REMARQUE: ce service peut être utilisé depuis n’importe quel client Web.

Utilisez curl pour bash le service IP de shtuff.it

 curl http://shtuff.it/myip/short 

Utilisez l’API ipify :

 curl 'https://api.ipify.org?format=json' 

Script Bash:

 #!/bin/bash ip=$(curl -s https://api.ipify.org) echo "My public IP address is: $ip" 

Utiliser uniquement bash (avec l’aide de icanhazip.com ):

 exec 3<>/dev/tcp/icanhazip.com/80 echo -e 'GET / HTTP/1.0\r\nhost: icanhazip.com\r\n\r' >&3 while read i do [ "$i" ] && myip="$i" done <&3 echo "$myip" 

bash ouvre un socket à icanhazip et envoie une requête http, l'adresse IP est renvoyée sur la dernière ligne non vide des données renvoyées. (les lignes précédentes sont des en-têtes http)

Cela évite le besoin de client http comme wget ou curl.