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?
curl ipinfo.io/ip
Ou
wget -qO- ipinfo.io/ip
Ou
lynx -source ipinfo.io/ip
curl ifconfig.me
serait le meilleur choix, au cas où vous n'auriez pas curl:
wget -qO- ifconfig.me/ip
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.
Si vous utilisez AWS EC2, vous pouvez utiliser:
curl checkip.amazonaws.com
REMARQUE: ce service peut être utilisé depuis n’importe quel client Web.
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.
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; } )
Essayez cette commande:
wget -O - -q icanhazip.com
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"
Utilisez curl to hit shtuff.it IP service
curl http://shtuff.it/myip/short
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.