GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je obtenir mon adresse IP externe dans un script shell ?

Je vous recommande de l'obtenir directement à partir d'un serveur DNS.

La plupart des autres réponses ci-dessous impliquent toutes de passer par HTTP vers 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. Ceux-ci changent assez fréquemment (descendent, changent de nom, publient des annonces, peuvent changer de format de sortie, etc.).

  1. Le protocole de réponse DNS est standardisé (le format restera compatible).
  2. Historiquement, les services DNS (Akamai, Google Public DNS, OpenDNS, ..) ont tendance à survivre beaucoup plus longtemps et sont plus stables, plus évolutifs et généralement plus prisés que n'importe quel nouveau service HTTP whatismyip dot-com branché. aujourd'hui.
  3. Cette méthode est intrinsèquement plus rapide (ne serait-ce que de quelques millisecondes !).

Utilisation de dig avec un résolveur OpenDNS :

$ dig @resolver4.opendns.com myip.opendns.com +short

Peut-être l'alias dans votre bashrc donc c'est facile à retenir

# https://unix.stackexchange.com/a/81699/37512
alias wanip='dig @resolver4.opendns.com myip.opendns.com +short' 
alias wanip4='dig @resolver4.opendns.com myip.opendns.com +short -4'
alias wanip6='dig @resolver1.ipv6-sandbox.opendns.com AAAA myip.opendns.com +short -6'

Répond avec une adresse IP simple :

$ wanip # wanip4, or wanip6
80.100.192.168 # or, 2606:4700:4700::1111

Syntaxe

(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 ANY Le type de requête renvoie un enregistrement AAAA ou A. Pour préférer spécifiquement la connexion IPv4 ou IPv6, 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 d'une connexion via IPv6, il ne peut pas renvoyer l'adresse A.

Serveurs alternatifs

Divers fournisseurs DNS proposent ce service, notamment OpenDNS, Akamai et Google Public DNS :

# OpenDNS (since 2009)
$ dig @resolver3.opendns.com myip.opendns.com +short
$ dig @resolver4.opendns.com myip.opendns.com +short
80.100.192.168

# OpenDNS IPv6
$ dig @resolver1.ipv6-sandbox.opendns.com AAAA myip.opendns.com +short -6
2606:4700:4700::1111

# Akamai (since 2009)
$ dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
80.100.192.168

# Akamai approximate
# NOTE: This returns only an approximate IP from your block,
# but has the benefit of working with private DNS proxies.
$ dig +short TXT whoami.ds.akahelp.net
"ip" "80.100.192.160"

# Google (since 2010)
# Supports IPv6 + IPv4, use -4 or -6 to force one.
$ 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 :

# https://unix.stackexchange.com/a/81699/37512
alias wanip4='dig @resolver4.opendns.com myip.opendns.com +short -4'

$ wanip4
80.100.192.168

Et pour votre adresse IPv6 :

# https://unix.stackexchange.com/a/81699/37512
alias wanip6='dig @ns1.google.com TXT o-o.myaddr.l.google.com +short -6'

$ wanip6
"2606:4700:4700::1111"

Dépannage

Si la commande ne fonctionne pas pour une raison quelconque, il peut y avoir un problème de réseau. Essayez d'abord l'une des alternatives ci-dessus.

Si vous soupçonnez un problème différent (avec le fournisseur en amont, l'outil de ligne de commande ou autre chose), exécutez la commande sans le +short option pour révéler les détails de la requête DNS. Par exemple :

$ dig @resolver4.opendns.com myip.opendns.com

;; Got answer: ->>HEADER<<- opcode: QUERY, status: NOERROR

;; QUESTION SECTION:
;myip.opendns.com.      IN  A

;; ANSWER SECTION:
myip.opendns.com.   0   IN  A   80.100.192.168

;; Query time: 4 msec

REMARQUE :Il s'agit d'informations externes Adresse IP (celle que les serveurs sur Internet voient lorsque vous vous y connectez) - si vous voulez interne Adresse IP (celle que votre propre ordinateur utilise pour les connexions, qui peut être différente) voir cette réponse .

TL;DR - Méthodes les plus rapides en 2015

La méthode la plus rapide utilisant DNS :

dig +short myip.opendns.com @resolver4.opendns.com

ou en utilisant externalip :

externalip dns

Le plus rapide avec HTTP :

curl -s http://whatismyip.akamai.com/

ou en utilisant externalip :

externalip http

Le plus rapide utilisant HTTPS avec un certificat valide :

curl -s https://4.ifcfg.me/

ou en utilisant externalip :

externalip https

En utilisant telnet :

Avec nc commande :

nc 4.ifcfg.me 23 | grep IPv4 | cut -d' ' -f4

ou en utilisant externalip :

externalip telnet

Avec telnet commande :

telnet 4.ifcfg.me 2>&1 | grep IPv4 | cut -d' ' -f4

En utilisant FTP :

echo close | ftp 4.ifcfg.me | awk '{print $4; exit}'

ou en utilisant externalip :

externalip ftp

Tout ce qui précède peut être exécuté en utilisant mon script externalip comme :

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

Maintenant une longue histoire...

Il existe de nombreuses options de différents serveurs fournissant l'adresse IP externe, en particulier via HTTP affiché ici ou ailleurs.

J'ai fait un benchmark pour voir si l'un d'entre eux est meilleur 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.

Repères

HTTP et HTTPS

Voici la source de mon script externalip-benchmark que j'ai utilisé :

  • https://raw.githubusercontent.com/rsp/scripts/master/externalip-benchmark

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 reçus 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 depuis 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 999999 pings signifient 100 % de perte de paquets.)

DNS

À titre de comparaison, voici les temps que d'autres méthodes prennent - testés le 16/06/2015 depuis Varsovie et Amsterdam.

Utilisation :

time dig +short myip.opendns.com @resolver1.opendns.com

prend généralement (temps réel) environ :

  • 0.035s de Varsovie
  • 0.015s d'Amsterdam

Il y a en fait quatre résolveurs qui peuvent être utilisés de cette manière :

  • resolver1.opendns.com
  • resolver2.opendns.com
  • resolver3.opendns.com
  • resolver4.opendns.com

Ils donnent tous les mêmes temps de réponse à Varsovie et à Amsterdam, mais ce n'est peut-être pas 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 :

  • 0.023s depuis Varsovie
  • 0.009s d'Amsterdam

mais peut ne pas fonctionner à l'avenir si l'adresse IP change (bien que cela puisse être peu probable pour un résolveur DNS bien connu - je devrais peut-être utiliser l'adresse IP dans mon script externalip - veuillez commenter).

Telnet

Telnet avec nc ou telnet commande (voir ci-dessus) prend généralement :

  • 0.103s depuis Varsovie
  • 0,035 s depuis Amsterdam

(Il n'y a pas de différence notable entre nc et telnet commandes.)

FTP

  • 0.104s depuis Varsovie
  • 0,036 s depuis Amsterdam

Noms de domaine

Toutes les méthodes seront plus rapides (en particulier lorsqu'elles sont exécutées pour la première fois) 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 changent l'adresse IP, ce qui peut être plus rapide mais moins évolutif.

Commentaires

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. J'aimerais tenir ce message à jour avec une sélection actuelle des services les plus performants.


 curl -s http://whatismijnip.nl |cut -d " " -f 5

Site remplacé par un site de travail néerlandais.


Linux
  1. Comment obtenir le nom de distribution et le numéro de version dans un simple script shell ?

  2. Comment obtenir l'adresse IP externe dans un script shell ?

  3. Comment obtenir la propre adresse IP et l'enregistrer dans une variable dans un script shell ?

  4. Comment gérer les commutateurs dans un script shell ?

  5. Comment définir une adresse proxy à l'échelle du système à l'aide d'un script shell ?

Comment utiliser des variables dans les scripts Shell

Comment trouver/obtenir votre adresse IP sous Linux

Comment créer des scripts shell

Comment obtenir votre adresse IP sous Linux

Comment créer un fichier temporaire en script shell ?

Comment exécuter une commande dans un script shell ?