web-dev-qa-db-fra.com

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

Dans le cadre d’un script d’installation, je souhaite formuler une "supposition éclairée" sur l’adresse IP des machines public. Il doit être aussi robuste que possible et fonctionner sur plusieurs hôtes et plates-formes. Voici un exemple: 

https://Gist.github.com/4669037

Ce script utilise 3 méthodes et utilise par défaut la valeur /etc/hostname. Je l'ai seulement testé sur Ubuntu jusqu'à présent. Cela sera-t-il susceptible de fonctionner sur d'autres distributions? Et y at-il des méthodes supplémentaires que je pourrais ajouter?

23
Jeroen
curl ipinfo.io/ip

Ou

wget -qO- ipinfo.io/ip

Ou

lynx -source ipinfo.io/ip

Obtenir l'adresse IP publique

43
Steven Penny

curl ifconfig.me serait le meilleur choix, au cas où vous n'auriez pas curl:

wget -qO- ifconfig.me/ip

9
Kent

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

  • curl/wget/netcat (nc) <URL> qui contient l'adresse du demandeur: devrait 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 s’exécuter en tant que root, sinon vous devrez également essayer /sbin/ifconfig ou /usr/sbin/ifconfig. Et si la machine a plus de NIC? Comment dites-vous quelle adresse IP est la bonne? Que faire si seul IPv6 est utilisé sur le réseau local de la machine? Dans tous les cas, vous obtiendrez le moins d'adresse IP publique possible (et éventuellement une adresse fausse si plusieurs interfaces sont configurées sur la machine - ce qui est souvent le cas de nos jours avec la virtualisation omniprésente utilisant des périphériques de prise réseau et/ou).

  • /etc/hostname: il n’est pas nécessaire qu’il existe, mais sur de nombreux systèmes, il s'agit de /etc/HOSTNAME et il ne contient pas d’adresse IP mais doit plutôt contenir le nom d’hôte (généralement le nom de domaine complet).

Le fait est que les possibilités d'échec sont nombreuses et que vous devriez probablement envisager a) de spécifier plus précisément les systèmes que vous ciblez ou b) si vous avez vraiment besoin de connaître la propriété intellectuelle - est une solution qui semble travailler dans des cas simples qui valent la peine d’être utilisés quand il échoue lamentablement dans une configuration légèrement plus compliquée? Si vous pensez avoir besoin de l’adresse IP, préparez un moyen de gérer les échecs avec élégance dans les cas où vous n’obtenez pas l’adresse IP du tout ou vous obtenez une erreur.

2
peterph

Si vous utilisez AWS EC2, vous pouvez utiliser:

curl checkip.amazonaws.com

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

1
Eric Semwenda

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 dessus, comme un serveur, ou une connexion ppp.

  • Pas une réponse exacte à la question, mais aide probablement d'autres personnes (comme moi)
  • Nécessite d'être root dans la plupart des (ou tous?) Cas

Vous pouvez obtenir la (première) route par défaut à partir de route -n, trouver l'interface qu'elle utilise et l'adresse 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 r r a r;echo $a; } )
1
Furkan Mustafa

Essayez cette commande:

wget -O - -q icanhazip.com
1
MCurbelo

Utilisez ipify API:

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"
0
RiccardoCh

Utilisez curl to hit shtuff.it IP service

curl http://shtuff.it/myip/short
0
Chris Montanaro

En utilisant 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 les en-têtes http)

Cela évite de recourir à un client http tel que wget ou curl.

0
Jasen