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

273

Je dois trouver mon adresse IP externe à partir d'un script shell. Au moment où j'utilise cette fonction:

myip () { 
    lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}

Mais cela dépend perl-libwww, perl-html-format, perl-html-treeinstallé. Quels autres moyens puis-je obtenir mon adresse IP externe?

Eugene Yarmash
la source
8
Qu'entendez-vous par l'adresse IP externe? Jusqu'à présent, les deux réponses utilisent HTTP. La réponse peut finir par être l'adresse IP du serveur proxy de votre fournisseur de services Internet. (Ce qui peut être ce que vous voulez.)
billpg
@billpg: Je veux dire l'adresse IP du routeur NAT
Eugene Yarmash
Ensuite, vous aurez besoin d'un service Web what-is-my-IP utilisant HTTPS. Hélas, je n'en connais pas.
billpg
1
@billpg ipcheckit.com
Gilles
checkip.amazonaws.com l' utilise avec un fournisseur bien connu
arulraj.net

Réponses:

443

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 à un serveur distant. Certaines d'entre elles ont nécessité l'analyse syntaxique de la sortie ou ont utilisé l'en-tête User-Agent pour que le serveur réponde en texte brut. Celles-ci changent assez souvent (descendre, changer leur nom, mettre en place des annonces, changer le format de sortie, etc.).

  1. Le protocole de réponse DNS est normalisé (le format restera compatible).
  2. Historiquement, les services DNS ( OpenDNS , Google Public DNS , ..) ont tendance à survivre beaucoup plus longtemps et sont plus stables, plus évolutifs et généralement mieux entretenus que le nouveau service HTTP hip de whatismyip.com qui fait actuellement fureur.
  3. Cette méthode est intrinsèquement plus rapide (ne serait-ce que de quelques millisecondes!).

Utiliser digavec OpenDNS comme résolveur:

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

Peut-être alias dans votre bashrcdonc il est facile de se souvenir

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

Syntaxe

(Abréviation 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 ANYtype de requête renvoie un enregistrement AAAA ou A. Pour préférer une connexion IPv4 ou IPv6 spécifiquement, utilisez les options -4ou -6en conséquence.

Pour 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 sur IPv6, il ne peut pas renvoyer l'adresse A.

Serveurs alternatifs et exemples

Outre OpenDNS, Akamai et Google proposent des services DNS similaires:

$ 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

Dépannage

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 aider à comprendre pourquoi cela ne fonctionne pas, exécutez la commande sans +shortpouvoir 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
Timo Tijhof
la source
18
vous avez raison c'est trop vite ..
Rahul Patil
4
@Krinkle c'est une excellente réponse. Existe-t-il un équivalent pour le myip.opendns.comDNS public Googles?
Kannan Mohan
12
J'ai trouvé que c'était environ 19 fois plus rapide que curl http://canhazip.com. Voir le site askubuntu.com/a/427092/2273
Adam Monsen
3
J'adore cette approche "sans dépendance" beaucoup mieux que toutes les autres propositions, sauf si vous êtes lié au port 80
binaryanomaly
5
Veuillez noter que dans certains cas, les routeurs fournissant un NAT traduisent également les réponses DNS (vous pouvez consulter wiki.nil.com/Network_address_translation_of_DNS_responses ); dans ce cas, vous devriez avoir recours à une réponse qui recommande une autre approche que le DNS.
Razvan Stefanescu
146

REMARQUE: Il s’agit d’une adresse IP externe (celle que les serveurs d’Internet voient lorsque vous vous y connectez). Si vous voulez une adresse IP interne (celle que votre ordinateur utilise pour les connexions, qui peut être différente), voyez ceci répondre .

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

La méthode la plus rapide utilisant DNS:

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

ou en utilisant externalip :

externalip dns

Le plus rapide en utilisant 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

Utiliser telnet:

Avec nccommande:

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

ou en utilisant externalip:

externalip telnet

Avec telnetcommande:

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

Utilisation de 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 en tant que:

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’IP externe, en particulier via HTTP posté 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 largement 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.

Des repères

HTTP et HTTPS

Voici la source de mon script externalip-benchmark 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 03/04/2015 à Varsovie - les adresses ont été modifiées pour protéger l'innocent:

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: certaines réponses rapides ont un contenu vide - elles ne sont pas valides.)

Meilleurs temps moyens de ping:

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 à 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 moyens de ping:

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.)

DNS

À des fins de comparaison, voici des moments où d’autres méthodes sont testées le 2015-06-16 de Varsovie et d’Amsterdam.

En utilisant:

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

prend généralement (temps réel) à propos de:

  • 0.035s de Varsovie
  • 0.015s d'Amsterdam

Il existe actuellement quatre résolveurs utilisables de cette façon:

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

Ils donnent tous le même temps de réponse à Varsovie et à Amsterdam, mais cela n’est peut-être pas le cas ailleurs.

Avec 208.67.222.222, l'adresse IP de resolver1.opendns.com au lieu de son nom de domaine est plus rapide:

  • 0.023s de Varsovie
  • 0.009s d'Amsterdam

mais peut ne pas fonctionner à l'avenir si l'adresse IP change jamais (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 ncou telnetcommande (voir ci-dessus) prend généralement:

  • 0.103s de Varsovie
  • 0.035s d'Amsterdam

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

FTP

  • 0.104s de Varsovie
  • 0.036s d'Amsterdam

Noms de domaine

Toutes les méthodes seront plus rapides (surtout lors de la première utilisation) 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 adresse IP nue - pas testé), mais cessera de fonctionner lorsque les services changeront l’adresse IP, de sorte qu’elle sera plus rapide mais moins durable

commentaires

Si vous voyez des résultats intéressants à partir de votre emplacement ou si vous pensez que certains autres hôtes devraient être recommandés au lieu de ceux que j'ai choisis, merci de poster un commentaire. S'il manque un service important, veuillez commenter ou publier un problème sur GitHub. J'aimerais que ce message reste à jour avec un choix actuel de services les plus performants.

rsp
la source
2
Avez-vous comparé la myip.opendns.comméthode DNS avec la réponse de Krinkle ? Actuellement, il semble que ce soit le gagnant par défaut parce qu’il n’est au courant d’aucun autre fournisseur pour cette méthode, mais il serait quand même utile de comparer les autres méthodes.
James Haigh
@ JamesHaigh Merci pour la suggestion. J'ai ajouté le DNS et d'autres méthodes (telnet, ftp) à la réponse. La méthode la plus rapide semble être le DNS utilisant directement l'adresse IP (au lieu du nom de domaine) du résolveur.
RSP
Vous devez également ajouter / tester canhazip.com / canhazip.com (HTTP et HTTPS).
xxdesmus
Vous pouvez ajouter myip.addr.space à votre liste. Je l'ai construit moi-même car je n'étais pas particulièrement satisfait des autres que j'avais vus à l'époque.
Michael Hampton
Parfois, j'obtiens des résultats différents avec dig +short myip.opendns.com @resolver1.opendns.com(36.86.63.180), dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short(118.98.115.34) et curl http://canhazip.com(36.71.64.71). Comment puis-je décider lequel est correct?
Sutandiono
80
 curl -s http://whatismijnip.nl |cut -d " " -f 5

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

Maciek Sawicki
la source
3
+1 Je savais à propos de whatismyip.com, mais pas whatismyip.org, c'est génial.
Julian
Jamais su à propos de celui-là! Super site!
bbosak
2
@ MaciekSawicki L' -soption est-elle vraiment nécessaire dans ce cas? J'ai essayé avec / sans dans mon fedora 15 - bash 4.2.10 (1) et cela a fonctionné dans les deux sens.
Ztank1013
4
Ne semble plus fonctionner via CLI, mais accéder à la page Web à partir d'un navigateur Web fonctionne. J'utilise openSUSE 12.1 x64.
SaultDon
5
whatismyip.coma supprimé le service gratuit pour vérifier les adresses IP externes. Donc, j'ai bien peur que cela ne soit plus correct. icanhazip.comfonctionne encore.
daSong
54

Depuis whatsmyip.org et ifconfig.me ont déjà été mentionnés:

curl -s icanhazip.com
Joschi
la source
4
Un autre: ip.appspot.com ou ip.appspot.com
Lekensteyn
1
Ces deux supportent IPv6.
Josh Lee
1
@ JoshLee, notez que icanhazip prend également en charge ipv6. En outre, note à l’opérateur, toutes ces curlsolutions (bien qu’elles soient valables) dépendent toujours d’une bibliothèque externe ( libcurl).
HalosGhost
Un autre: ifcfg.me
Eun
18

Vous pouvez utiliser ifconfig.me comme alternative à whatismyip.org.

curl -s http://ifconfig.me

Ifconfig.me a aussi quelques fonctionnalités supplémentaires. Pour savoir quelles autres informations vous pouvez recevoir, visitez le site Web.

M. Mortel
la source
5
C'est extrêmement lent . J'ai souvent des temps de réponse de plus de 30 secondes, parfois même d'une minute! Parfois, il s’agit d’une demi-seconde (ce qui est toujours beaucoup), puis de 15 secondes environ. Ceci est testé à partir de différents endroits. Voir ma réponse pour plus d'informations et de points de repère.
RSP
15
wget -O - -q http://whatismyip.org/
ztank1013
la source
3
Je n'ai pas pu obtenir mon adresse IP de cette façon, mais simplement:<img src='ipimg.php'/>
Yuugian
Je l'ai eu avec une bonne quantité de magie regex, mais ce n'était pas facile. Si vous insistez pour utiliser ce service, veillez à envelopper la ligne dans un script:$ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
syntaxerror le
13

Amazon AWS

curl https://checkip.amazonaws.com

Exemple de sortie:

123.123.123.123

Je l'aime parce que:

  • il renvoie uniquement l'adresse IP en texte brut, rien d'autre
  • il s'agit d'un fournisseur bien connu qui a peu de chances de se déconnecter de si tôt
Ciro Santilli 改造 中心 六四 事件
la source
9

Je préfère utiliser curlmyip.com. C'est aussi simple que:

curl curlmyip.com

C'est court et simple à retenir.

Garrett Fogerlie
la source
Pour une utilisation dans « bashl'intention du PO», vous ne pouvez pas vous passer de l' -soption mentionnée dans d'autres réponses.
Serge Stroobandt
3
@SergeStroobandt Oui, vous le pouvez. Tout ce que fait le -scommutateur, c'est de l'exécuter en mode silencieux, c'est-à-dire. les messages d'erreur ne seront pas affichés. Cela dépend donc de la manière dont il veut que son script traite les erreurs. La commande elle-même renvoie une adresse IP aussi fiable que l’utilisation de -s.
Garrett Fogerlie
1
Jusqu'à présent, ce site était le plus fiable de plusieurs tests.
Amos Shapira
9
curl ident.me

OU

curl ifconfig.me

OU

curl tnx.nl/ip

OU

curl ipecho.net/plain

OU

curl ip.appspot.com

OU

curl whatismyip.akamai.com

OU

curl icanhazip.com

OU

curl wgetip.com

OU

curl ip.tyk.nu

OU

curl curlmyip.com

OU

curl corz.org/ip

OU

curl bot.whatismyipaddress.com

Référence

Mandar Shinde
la source
6
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1
Eugene Yarmash
la source
Sortie vide ici, bien que le site fonctionne. Une idée pourquoi? Je suis derrière un proxy, si cela est pertinent, mais wget icanhazip.comfonctionne.
l0b0
@ l0b0 Essayez d'omettre la | tail -n1pièce et voyez ce que vous obtenez de la procuration
Eugene Yarmash
Rien, il suffit de quitter le code 1. Idem pour netcat icanhazip.com 80. On dirait que cela ignore $http_proxyet amis, car la spécification du proxy et du port avec -xjuste abouti à un processus de blocage.
l0b0
@ l0b0: netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1pour un proxy HTTP de base (en supposant qu'il s'exécute sur le port 3128). Cependant, vous obtiendrez évidemment l'adresse IP du proxy.
triplee
1
HTTP 1.0 n’a pas d’en- Host:tête de requête - l’hébergement virtuel basé sur le nom était l’une des améliorations majeures de HTTP 1.1. Modifiez la demande pour spécifier HTTP / 1.1 ou supprimez l'en-tête Host (je recommande l'ancien).
un CVn
4

Si, après avoir lu toutes ces suggestions, vous souhaitez lire encore plus, voici un script Bash sur-conçu.

Il contient une liste de serveurs DNS et HTTP qui semblent bien fonctionner à partir de février 2017.

Si vous l’avez dig, il essaiera d’abord le DNS qui est presque d’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'en avez pas digou si tous les serveurs DNS ont échoué, il essaie ensuite 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 verbosevariable 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 si nécessaire:
https://github.com/mivk/myip

mivk
la source
3

Si vous souhaitez utiliser HTTPS pour éviter certains pièges:

_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"
Chris Down
la source
2
Peut-être pourriez-vous préciser quels sont les pièges potentiels que vous évitez ici?
Caleb
Le domaine ipcheckit.com est apparemment à vendre et n'héberge plus le service d'affichage d'adresse IP.
Manatwork
ah, les pièges des scripts writeonly :)
рослав Рахматуллин
@Chris Down, la technique est toujours valable, vous avez simplement besoin d'un autre site compatible SSL pour l'utiliser.
Caleb
3

Voici une autre alternative qui dépend des hôtes dont les activités sont résolues par la gestion d'une adresse IP dynamique plutôt que par des sites "de service public" susceptibles de disparaître ou de changer de format.

  1. Enregistrez votre serveur sur l'un des nombreux services DNS dynamiques gratuits (par exemple, no-ip.com). Vous obtiendrez ainsi une entrée DNS telle que xxx.no-ip.org.
  2. Installez l'outil de mise à jour dynamique du service (rapporte les modifications IP au service).

Pour obtenir l'adresse IP dans un script, procédez comme suit:

external_ip=`dig +short xxx.no-ip.org`

Idéal dans le travail cron pour vérifier si une adresse IP dynamique a été modifiée et si certaines entrées de configuration doivent être modifiées.

cgmonroe
la source
3

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'
Dai_Trying
la source
+1 Même si elle a l'air si maladroite, cette approche m'a sauvé la vie plusieurs fois. Parce qu'Internet n'est pas WWW . Vous pouvez avoir un accès Internet, mais vous pouvez (généralement dans les salles de serveurs) être condamné à une console sans interface graphique. Dans ce cas, il est important de vous rappeler par cœur l' une des URL du service checkIP. Et comme celui-ci est assez courant, il ne semble que compilé, car vous aurez plus de chances de vous rappeler celui de DynDNS que celui de amazonaws. Autrement dit, si vous n'avez AUCUN moyen de chercher sur Google. (même pas lynx).
erreur de syntaxe le
3

Étant donné que je ne me fie pas à la connexion ou au service, j'utilise le code suivant, qui tente d'obtenir l'adresse IP à l'aide de différents services (n'hésitez pas à en ajouter d'autres):

# 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 qu’il $IPs’agit d’une IP valide en 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;
}
Franck Dernoncourt
la source
3

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/?

Eun
la source
Quel est le nslookuplien entre la digméthode et la méthode dans la réponse de Krinkle ? Ils utilisent tous les deux DNS, non? Alors, puis-je laisser passer une option pour diglui permettre de récupérer le même enregistrement DNS que celui nslookupen cours ici?
James Haigh
Oui, vous pouvez utiliser dig +short . @ifcfg.mesi vous le souhaitez
Eun
2

Je gère un service en nuage pour ma famille et j’ai créé ce script rapide, que j’exécutais crontous les matins à 5 heures, parce que je n’étais pas cher et que je n’achèterais pas une adresse IP statique.

Il saisit l'adresse IP publique et l'envoie par courrier électronique à mes utilisateurs. Faites-le en format hyperlien afin que ma mère n'ait pas à taper les ports ni quoi que ce soit. Peut-être que quelqu'un d'autre peut l'utiliser.

#!/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" user1@someemail.com, user2@ect.com
Volonté
la source
1

Cela affichera l'adresse IP actuelle dans une fenêtre contextuelle:

zenity --info --text "$(curl -s icanhazip.com)"
basic6
la source
1

J'ai configuré un service qui renvoie une adresse IP sous forme de texte JSON / XML ou brut. Vous pouvez les trouver ici

http://ipof.in/txt

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 est que même si vous êtes en Wifi, vous aurez l'adresse publique.

Donc, un simple alias myip = "curl https://ipof.in/txt " obtiendra votre IP

vivekv
la source
1

Alternativement, vous pouvez utiliser STUN qui a été inventé pour répondre à cette question de manière automatisée et qui est largement utilisé dans les communications Internet, par exemple par SIP et WebRTC .

En utilisant 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

A.B.C.Dest l'adresse IP de votre machine sur le réseau local et où se trouvent les W.X.Y.Zserveurs d'adresse IP, tels que les sites Web vus de l'extérieur (et celui que vous recherchez). En utilisant, sedvous 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 alternative STUN utilisant uniquement des outils de base en ligne de commande, reportez-vous à ma réponse sur AskUbuntu (conçu comme un exercice amusant et non pour une utilisation en production).

Victor Klos
la source
0

W3m Plaintext-Browser est idéal pour la bash. Vous pouvez utiliser grepet tailpour raccourcir la réponse comme suit:

w3m -no-cookie -dump "http://www.whatismyip.com/" | grep -A 1 -m 1 "Your IP:" | tail -n 1
McPeppr
la source
0

Utilisez curl pour accéder au service ip de shtuff.it

curl -s https://shtuff.it/myip/short
Chris Montanaro
la source
301 déplacé en permanence
McPeppr
le lien est mort maintenant
Eugene Bujak le
0

En utilisant une requête DNS même derrière un routeur NAT traduisant des 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
SebMa
la source
1
Pourquoi recommanderiez-vous l'un sur l'autre?
Roaima
@roaima Vous avez raison, c'est à chaque utilisateur de décider.
SebMa