J'ai besoin de trouver mon adresse IP externe à partir d'un script Shell. Pour le moment j'utilise cette fonction:
myip () {
lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}
Mais cela dépend de Perl-libwww
, Perl-html-format
, Perl-html-tree
installée. De quelles autres façons puis-je obtenir mon adresse IP externe?
Je recommanderais de l'obtenir directement à partir d'un serveur DNS.
La plupart des autres réponses ci-dessous impliquent toutes de passer par HTTP sur un serveur distant. Certains d'entre eux nécessitaient une analyse de la sortie ou s'appuyaient sur l'en-tête User-Agent pour que le serveur réponde en texte brut. Celles-ci changent assez fréquemment (descendez, changez leur nom, affichez des annonces, peut changer le format de sortie, etc.).
Utiliser Dig
avec OpenDNS comme résolveur:
Dig @resolver1.opendns.com ANY myip.opendns.com +short
Peut-être l'alias dans votre bashrc
donc c'est facile à retenir
alias wanip='Dig @resolver1.opendns.com ANY myip.opendns.com +short'
Répond avec une adresse IP simple:
$ wanip
80.100.192.168 # or, 2606:4700:4700::1111
(Abrégé de https://ss64.com/bash/Dig.html ) :
usage: Dig [@global-dnsserver] [q-type] <hostname> <d-opt> [q-opt]
q-type one of (A, ANY, AAAA, TXT, MX, ...). Default: A.
d-opt ...
+[no]short (Display nothing except short form of answer)
...
q-opt one of:
-4 (use IPv4 query transport only)
-6 (use IPv6 query transport only)
...
Le type de requête ANY
renvoie un enregistrement AAAA ou A. Pour préférer la connexion IPv4 ou IPv6 en particulier, utilisez le -4
ou -6
options en conséquence.
Pour exiger que la réponse soit une adresse IPv4, remplacez ANY par A
; pour IPv6, remplacez-le par AAAA
. Notez qu'il ne peut renvoyer que l'adresse utilisée pour la connexion. Par exemple, lors de la connexion via IPv6, il ne peut pas renvoyer l'adresse A.
En plus d'OpenDNS, il existe des services DNS similaires fournis par Akamai et Google:
$ Dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
80.100.192.168
$ Dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
"80.100.192.168"
Exemple d'alias qui demande spécifiquement une adresse IPv4:
alias wanip4='Dig @resolver1.opendns.com A myip.opendns.com +short -4'
$ wanip4
80.100.192.168
Et pour IPv6:
alias wanip6='Dig @resolver1.opendns.com AAAA myip.opendns.com +short -6'
$ wanip6
2606:4700:4700::1111
Si la commande ne fonctionne pas pour une raison quelconque, il peut y avoir un problème avec le fournisseur en amont, l'outil de ligne de commande ou autre chose. Pour comprendre pourquoi cela ne fonctionne pas, exécutez la commande sans le +short
option pour révéler les détails de la requête DNS. Par exemple:
$ Dig @resolver1.opendns.com ANY myip.opendns.com
;; Got answer: ->>HEADER<<- opcode: QUERY, status: NOERROR
;; QUESTION SECTION:
;myip.opendns.com. IN ANY
;; ANSWER SECTION:
myip.opendns.com. 0 IN AAAA 2606:4700:4700::1111
;; Query time: 4 msec
;; WHEN: Fri Apr 11 00:00:01 GMT 2011
REMARQUE: il s'agit de adresse IP externe (celle que les serveurs sur Internet voient lorsque vous vous y connectez) - si vous le souhaitez adresse IP interne (celle que votre propre ordinateur utilise pour les connexions, qui peut être différente) voir ( cette réponse .
Dig +short myip.opendns.com @resolver1.opendns.com
ou en utilisant externalip :
externalip dns
curl -s http://whatismyip.akamai.com/
ou en utilisant externalip:
externalip http
curl -s https://4.ifcfg.me/
ou en utilisant externalip:
externalip https
Avec la commande nc
:
nc 4.ifcfg.me 23 | grep IPv4 | cut -d' ' -f4
ou en utilisant externalip:
externalip telnet
Avec la commande telnet
:
telnet 4.ifcfg.me 2>&1 | grep IPv4 | cut -d' ' -f4
echo close | ftp 4.ifcfg.me | awk '{print $4; exit}'
ou en utilisant externalip:
externalip ftp
externalip dns
externalip http
externalip https
externalip telnet
externalip ftp
Il existe de nombreuses options de différents serveurs fournissant l'IP externe, en particulier via HTTP, publiés ici ou ailleurs.
J'ai fait un point de repère pour voir si certains d'entre eux sont meilleurs que les autres et j'ai été surpris par les résultats. Par exemple. l'un des ifconfig.me les plus recommandés était presque toujours le plus lent pour moi, prenant parfois plusieurs secondes pour répondre. Beaucoup ne fonctionnent pas sur HTTPS, ou fonctionnent mais ont des certificats non valides. Certains ont des temps de réponse très incohérents.
C'est la source de mon script de référence externeip que j'ai utilisé:
Vous pouvez l'exécuter vous-même pour voir quels services mentionnés ici valent la peine d'être utilisés:
wget https://raw.githubusercontent.com/rsp/scripts/master/externalip-benchmark
chmod a+x externalip-benchmark
./externalip-benchmark
Mes résultats que j'ai obtenus le 2015-04-03 de Varsovie - les adresses ont été modifiées pour protéger les innocents:
Meilleurs temps de réponse http:
0.086s http://ip.tyk.nu/ - answer='172.31.133.7'
0.089s http://whatismyip.akamai.com/ - answer='172.31.133.7'
0.091s http://tnx.nl/ip - answer='172.31.133.7'
0.117s http://ifcfg.me/ - answer='172.31.133.7'
0.156s http://l2.io/ip - answer='172.31.133.7'
0.317s http://ip.appspot.com/ - answer='172.31.133.7'
0.336s http://ident.me/ - answer='172.31.133.7'
0.338s http://ipof.in/txt - answer='172.31.133.7'
0.347s http://icanhazip.com/ - answer='172.31.133.7'
0.496s http://curlmyip.com/ - answer='172.31.133.7'
0.527s http://wgetip.com/ - answer='172.31.133.7'
0.548s http://curlmyip.com/ - answer='172.31.133.7'
0.665s http://bot.whatismyipaddress.com/ - answer='172.31.133.7'
0.665s http://eth0.me/ - answer='172.31.133.7'
1.041s http://ifconfig.me/ - answer='172.31.133.7'
1.049s http://corz.org/ip - answer='172.31.133.7'
1.598s http://ipecho.net/plain - answer='172.31.133.7'
Meilleurs temps de réponse https:
0.028s https://curlmyip.com/ - answer=''
0.028s https://curlmyip.com/ - answer=''
0.029s https://l2.io/ip - answer=''
0.029s https://tnx.nl/ip - answer=''
0.072s https://whatismyip.akamai.com/ - answer=''
0.113s https://ipecho.net/plain - answer=''
0.117s https://ident.me/ - answer=''
0.207s https://ip.tyk.nu/ - answer='172.31.133.7'
0.214s https://ipof.in/txt - answer='172.31.133.7'
0.259s https://ifcfg.me/ - answer='172.31.133.7'
0.289s https://corz.org/ip - answer=''
0.436s https://ip.appspot.com/ - answer='172.31.133.7'
0.448s https://bot.whatismyipaddress.com/ - answer=''
0.454s https://eth0.me/ - answer=''
0.673s https://icanhazip.com/ - answer='172.31.133.7'
5.255s https://ifconfig.me/ - answer=''
10.000s https://wgetip.com/ - answer=''
(Remarque: il existe des réponses rapides avec un contenu vide - celles-ci ne sont pas valides.)
Meilleurs temps de ping moyens:
10.210 //whatismyip.akamai.com/
36.820 //tnx.nl/ip
37.169 //ip.tyk.nu/
39.412 //ipof.in/txt
40.967 //ident.me/
41.257 //ipecho.net/plain
43.918 //ifcfg.me/
45.720 //l2.io/ip
64.749 //ip.appspot.com/
123.412 //corz.org/ip
134.245 //wgetip.com/
157.997 //icanhazip.com/
161.613 //curlmyip.com/
162.100 //curlmyip.com/
268.734 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/
Voici les résultats que j'ai obtenus le 03/04/2015 d'Amsterdam:
Meilleurs temps de réponse http:
0.021s http://ipecho.net/plain - answer='172.31.13.37'
0.027s http://tnx.nl/ip - answer='172.31.13.37'
0.035s http://whatismyip.akamai.com/ - answer='172.31.13.37'
0.039s http://ifcfg.me/ - answer='172.31.13.37'
0.045s http://l2.io/ip - answer='172.31.13.37'
0.142s http://ident.me/ - answer='172.31.13.37'
0.144s http://ipof.in/txt - answer='172.31.13.37'
0.150s http://ip.appspot.com/ - answer='172.31.13.37'
0.150s http://ip.tyk.nu/ - answer='172.31.13.37'
0.170s http://icanhazip.com/ - answer='172.31.13.37'
0.190s http://eth0.me/ - answer='172.31.13.37'
0.191s http://wgetip.com/ - answer='172.31.13.37'
0.301s http://curlmyip.com/ - answer='172.31.13.37'
0.330s http://bot.whatismyipaddress.com/ - answer='172.31.13.37'
0.343s http://curlmyip.com/ - answer='172.31.13.37'
0.485s http://corz.org/ip - answer='172.31.13.37'
3.549s http://ifconfig.me/ - answer='172.31.13.37'
Meilleurs temps de réponse https:
0.004s https://curlmyip.com/ - answer=''
0.012s https://curlmyip.com/ - answer=''
0.012s https://tnx.nl/ip - answer=''
0.016s https://ipecho.net/plain - answer=''
0.071s https://whatismyip.akamai.com/ - answer=''
0.096s https://ifcfg.me/ - answer='172.31.13.37'
0.097s https://ident.me/ - answer=''
0.187s https://corz.org/ip - answer=''
0.187s https://ip.appspot.com/ - answer='172.31.13.37'
0.189s https://ip.tyk.nu/ - answer='172.31.13.37'
0.195s https://eth0.me/ - answer=''
0.253s https://l2.io/ip - answer=''
0.300s https://ipof.in/txt - answer='172.31.13.37'
0.324s https://bot.whatismyipaddress.com/ - answer=''
0.512s https://icanhazip.com/ - answer='172.31.13.37'
1.272s https://ifconfig.me/ - answer=''
10.002s https://wgetip.com/ - answer=''
Meilleurs temps de ping moyens:
1.020 //ipecho.net/plain
1.087 //whatismyip.akamai.com/
5.011 //ip.appspot.com/
6.942 //ident.me/
7.017 //ipof.in/txt
8.209 //tnx.nl/ip
11.343 //ip.tyk.nu/
12.647 //ifcfg.me/
13.828 //l2.io/ip
81.642 //icanhazip.com/
85.447 //wgetip.com/
91.473 //corz.org/ip
102.569 //curlmyip.com/
102.627 //curlmyip.com/
247.052 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/
(Les pings 999999 signifient 100% de perte de paquets.)
Pour une comparaison, voici les moments où d'autres méthodes ont été testées le 16/06/2015 à Varsovie et Amsterdam.
En utilisant:
time Dig +short myip.opendns.com @resolver1.opendns.com
prend généralement (temps réel de l'horloge murale) environ:
Il existe en fait quatre résolveurs qui peuvent être utilisés de cette façon:
Ils donnent tous les mêmes temps de réponse à Varsovie et à Amsterdam, mais cela peut ne pas être le cas dans d'autres endroits.
En utilisant 208.67.222.222 - l'IP de resolver1.opendns.com au lieu de son nom de domaine est plus rapide:
mais peut ne pas fonctionner à l'avenir si l'IP change jamais (bien que cela puisse être peu probable pour un résolveur DNS bien connu - je devrais peut-être utiliser l'IP dans mon externalip script - veuillez commenter).
Telnet avec la commande nc
ou telnet
(voir ci-dessus) prend généralement:
(Il n'y a pas de différence notable entre les commandes nc
et telnet
.)
Toutes les méthodes seront plus rapides (en particulier lors de la première exécution) lorsque les adresses IP seront utilisées à la place des noms de domaine des services donnés (sauf avec HTTP qui peut utiliser des serveurs virtuels basés sur l'hôte et ne pas fonctionner avec une IP nue - non testé) mais cessera de fonctionner lorsque les services changeront l'adresse IP, ce qui pourrait être plus rapide mais moins évolutif.
Si vous voyez des résultats intéressants de votre emplacement, ou si vous pensez que d'autres hôtes devraient être recommandés au lieu de ceux que j'ai choisis, veuillez poster un commentaire. S'il manque un service important, veuillez commenter ou publier un problème sur GitHub. Je voudrais garder ce post mis à jour avec un choix actuel de services les plus performants.
curl -s http://whatismijnip.nl |cut -d " " -f 5
Site remplacé par un néerlandais qui fonctionne.
Depuis whatsmyip.org et ifconfig.me ont déjà été mentionnés:
curl -s icanhazip.com
Vous pouvez utiliser ifconfig.me comme alternative à whatismyip.org.
curl -s http://ifconfig.me
Ifconfig.me a également des fonctionnalités supplémentaires. Pour savoir quelles autres informations vous pouvez recevoir, visitez le site Web.
Amazon AWS
curl https://checkip.amazonaws.com
Exemple de sortie:
123.123.123.123
Je l'aime parce que:
wget -O - -q http://whatismyip.org/
curl ident.me
OR
curl ifconfig.me
OR
curl tnx.nl/ip
OR
curl ipecho.net/plain
OR
curl ip.appspot.com
OR
curl whatismyip.akamai.com
OR
curl icanhazip.com
OR
curl wgetip.com
OR
curl ip.tyk.nu
OR
curl curlmyip.com
OR
curl corz.org/ip
OR
curl bot.whatismyipaddress.com
Je préfère utiliser curlmyip.com C'est aussi simple que:
curl curlmyip.com
C'est court et simple à retenir.
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1
Si, après avoir lu toutes ces suggestions, vous souhaitez en savoir plus, voici un script Bash sans doute sur-conçu.
Il contient une liste de serveurs DNS et HTTP qui semblent bien fonctionner en février 2017.
Si vous avez Dig
, il essaie d'abord DNS qui est presque un ordre de grandeur plus rapide que les différents services HTTP.
Il sort à la première réponse qu'il obtient.
Si vous n'avez pas Dig
ou si tous les serveurs DNS ont échoué, il essaie alors les services HTTP jusqu'à ce qu'il obtienne une réponse.
Les serveurs sont classés par ordre alphabétique, mais sont mélangés avant utilisation pour éviter de toujours utiliser le même.
#!/bin/bash
## Get my external IP
timeout=2 # seconds to wait for a reply before trying next server
verbose=1 # prints which server was used to STDERR
dnslist=(
"Dig +short myip.opendns.com @resolver1.opendns.com"
"Dig +short myip.opendns.com @resolver2.opendns.com"
"Dig +short myip.opendns.com @resolver3.opendns.com"
"Dig +short myip.opendns.com @resolver4.opendns.com"
"Dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com"
"Dig +short -4 -t a whoami.akamai.net @ns1-1.akamaitech.net"
"Dig +short whoami.akamai.net @ns1-1.akamaitech.net"
)
httplist=(
4.ifcfg.me
alma.ch/myip.cgi
api.infoip.io/ip
api.ipify.org
bot.whatismyipaddress.com
canhazip.com
checkip.amazonaws.com
eth0.me
icanhazip.com
ident.me
ipecho.net/plain
ipinfo.io/ip
ipof.in/txt
ip.tyk.nu
l2.io/ip
smart-ip.net/myip
tnx.nl/ip
wgetip.com
whatismyip.akamai.com
)
# function to shuffle the global array "array"
shuffle() {
local i tmp size max Rand
size=${#array[*]}
max=$(( 32768 / size * size ))
for ((i=size-1; i>0; i--)); do
while (( (Rand=$RANDOM) >= max )); do :; done
Rand=$(( Rand % (i+1) ))
tmp=${array[i]} array[i]=${array[Rand]} array[Rand]=$tmp
done
}
## if we have Dig and a list of dns methods, try that first
if hash Dig 2>/dev/null && [ ${#dnslist[*]} -gt 0 ]; then
eval array=( \"\${dnslist[@]}\" )
shuffle
for cmd in "${array[@]}"; do
[ "$verbose" == 1 ] && echo Trying: $cmd 1>&2
ip=$(timeout $timeout $cmd)
if [ -n "$ip" ]; then
echo $ip
exit
fi
done
fi
# if we haven't succeeded with DNS, try HTTP
if [ ${#httplist[*]} == 0 ]; then
echo "No hosts in httplist array!" >&2
exit 1
fi
# use curl or wget, depending on which one we find
curl_or_wget=$(if hash curl 2>/dev/null; then echo "curl -s"; Elif hash wget 2>/dev/null; then echo "wget -qO-"; fi);
if [ -z "$curl_or_wget" ]; then
echo "Neither curl nor wget found. Cannot use http method." >&2
exit 1
fi
eval array=( \"\${httplist[@]}\" )
shuffle
for url in "${array[@]}"; do
[ "$verbose" == 1 ] && echo Trying: $curl_or_wget "$url" 1>&2
ip=$(timeout $timeout $curl_or_wget "$url")
if [ -n "$ip" ]; then
echo $ip
exit
fi
done
Exemple d'utilisation (j'ai appelé le script myip
):
$ myip
Trying: Dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com
"151.101.65.69"
$ ip=$(myip); echo "IP = '$ip'"
Trying: Dig +short myip.opendns.com @resolver1.opendns.com
IP = '151.101.65.69'
Mettez en commentaire la variable verbose
en haut du script pour éviter d'imprimer le serveur utilisé.
Mise à jour: ce script est maintenant également sur Github où je pourrais le mettre à jour en cas de besoin:
https://github.com/mivk/myip
Cela fonctionne toujours pour moi, je l'utilise dans mon conky pour obtenir mon adresse IP.
wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'
ifcfg.me prend en charge:
curl ifcfg.me
nslookup . ifcfg.me
telnet ifcfg.me
ftp ifcfg.me
finger @ifcfg.me
IPv4 et IPv6, encore plus de choses avec curl: ifcfg.me/?
Comme je ne me fie pas à la connexion ou au service, j'utilise le code suivant, qui essaie d'obtenir l'IP en utilisant différents services (n'hésitez pas à en ajouter plus):
# Get my ip address and put in a file
declare -a arr=("ipecho.net/plain" "ident.me" "tnx.nl/ip" "ip.appspot.com" "https://shtuff.it/myip/short/")
IP=$(curl -s --retry 3 --retry-delay 10 ipecho.net/plain)
while [ -z "$IP" ] # If no IP found yet, keep trying!
do
sleep 30
IP=$(curl -s --retry 3 --retry-delay 10 ${arr[$(( RANDOM % ${#arr[@]} ))]})
done
echo -n "$IP" > /root/clientIP.txt #puts ip address in clientIP.txt
echo "Our address is $IP"
Pour ajouter plus de robustesse (par exemple si l'un des services change de format), vous pouvez vérifier que $IP
est une IP valide utilisant la --- fonction suivante:
# Verify that the parameter passed is an IP Address:
# http://zindilis.com/blog/2013/05/10/bash-check-that-string-is-ip.html
# @Author: Marios Zindilis
# @License: Creative Commons Attribution-ShareAlike 4.0 International License.
# @Date: 2013-05-10
function is_IP() {
if [ `echo $1 | grep -o '\.' | wc -l` -ne 3 ]; then
echo "Parameter '$1' does not look like an IP Address (does not contain 3 dots).";
exit 1;
Elif [ `echo $1 | tr '.' ' ' | wc -w` -ne 4 ]; then
echo "Parameter '$1' does not look like an IP Address (does not contain 4 octets).";
exit 1;
else
for OCTET in `echo $1 | tr '.' ' '`; do
if ! [[ $OCTET =~ ^[0-9]+$ ]]; then
echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' is not numeric).";
exit 1;
Elif [[ $OCTET -lt 0 || $OCTET -gt 255 ]]; then
echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' in not in range 0-255).";
exit 1;
fi
done
fi
return 0;
}
Si vous souhaitez utiliser HTTPS pour éviter certains pièges potentiels:
_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"
Voici une autre alternative qui dépend des hôtes qui résolvent l'activité de gestion de l'IP dynamique plutôt que des sites de "service public" qui peuvent disparaître ou changer de format.
Pour obtenir l'adresse IP dans un script, faites simplement:
external_ip=`Dig +short xxx.no-ip.org`
Idéal pour une utilisation dans le travail cron pour vérifier si l'IP dynamique a changé et certaines entrées de configuration doivent être modifiées.
Cela montrera l'adresse IP actuelle dans une fenêtre contextuelle:
zenity --info --text "$(curl -s icanhazip.com)"
J'exécute un service cloud pour ma famille et j'ai fait ce script rapide que j'exécute dans un cron
chaque matin à 5 heures car je suis bon marché et je n'achèterai pas une adresse IP statique.
Il saisit l'IP publique et l'envoie par e-mail à mes utilisateurs. Je l'ai envoyé par e-mail au format hyperlien pour que ma mère n'ait pas à taper les ports ou quoi que ce soit. Peut-être que quelqu'un d'autre peut l'utiliser pour.
#!/bin/bash
ipvariable=$(wget http://ipecho.net/plain -O - -q);
echo "Today the location is http://$ipvariable:123456/foldertheyreach" | mail -s "From your friendly cloud service provider" [email protected], [email protected]
J'ai configuré un service qui renvoie l'adresse IP en JSON/XML ou en texte brut. Vous pouvez les trouver ici
La même URL avec/json et/xml vous donnera également d'autres formats
Si vous voulez HTTPS, vous pouvez utiliser les mêmes URL avec le préfixe https. L'avantage étant que même si vous êtes sur un Wifi vous obtiendrez l'adresse publique.
Ainsi, un simple alias myip = "curl https://ipof.in/txt " obtiendra votre IP
Utiliser une requête DNS même derrière un routeur NAT traduisant les adresses DNS, cela peut fonctionner:
$ Dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com | cut -d'"' -f2
x.y.z.t
ou, vous pouvez utiliser la méthode de requête HTTP à la place:
$ curl -s ipinfo.io/ip
x.y.z.t
Utilisez curl pour accéder au service IP de shtuff.it
curl -s https://shtuff.it/myip/short
Vous pouvez également utiliser STUN qui a été inventé pour répondre à cette question de manière automatisée et est largement utilisé dans les communications Internet, par exemple par SIP et WebRTC .
Utiliser un stunclient (sur debian/ubuntu do apt-get install stuntman-client
) faites simplement:
$ stunclient stun.services.mozilla.com
Binding test: success
Local address: A.B.C.D:42541
Mapped address: W.X.Y.Z:42541
où A.B.C.D
est l'adresse IP de votre machine sur le réseau local et W.X.Y.Z
est le serveur d'adresses IP que les sites Web voient de l'extérieur (et celui que vous recherchez). En utilisant sed
, vous pouvez réduire la sortie ci-dessus à une seule adresse IP:
stunclient stun.services.mozilla.com |
sed -ne "s/^Mapped address: \(.*\):.*$/\1/p"
Pour une recherche STUN alternative n'utilisant que des outils de ligne de commande de base, voir ma réponse sur AskUbunt (conçu comme un exercice amusant, pas pour une utilisation en production).
Le navigateur w3m Plaintext-Browser est idéal pour le bash. Vous pouvez utiliser grep
et tail
pour raccourcir la réponse comme suit:
w3m -no-cookie -dump "http://www.whatismyip.com/" | grep -A 1 -m 1 "Your IP:" | tail -n 1