Obtenez l'adresse IP externe en shell sans creuser en 2016?

Cette question: " Comment puis-je get mon adresse IP externe dans bash? "

Résout la question avec un appel à creuser:

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

c'est la résolution la plus rapide possible, car il s'agit d'un seul package UDP.

Cependant, ce n'est qu'un seul site: OpenDNS, existe-t-il une alternative?

Et, utilise creuser, ce qui n'est pas disponible par défaut. Encore une fois, y a-t-il une alternative?


Note : J'avais besoin de résoudre ce problème car le service OpenDNS ne fonctionnait pas localement à cause d'une redirection (aussi locale) du port 53. J'ai finalement trouvé la raison (j'avais oublié la redirection). Tout d'abord, en utilisant cette command pour find si dnssec fonctionne (drapeau d' ad manquant localement):

 dig pir.org +dnssec +multi 

Et en utilisant également cette command pour savoir si votre FAI redirige les résolutions OpenDNS:

 host -t txt which.opendns.com 208.67.220.220 

Si vous êtes redirigé, vous obtiendrez une réponse de: "I am not an OpenDNS resolver."

Une alternative est Google DNS:

 myip(){ dig @8.8.8.8 -t txt oo.myaddr.l.google.com | grep "client-subnet" | grep -o "\([0-9]\{1,3\}\.\)\{3\}\([0-9]\{1,3\}\)" ; } 

Si votre système n'a pas creusé, alors l'hôte sera exactement équivalent:

 myip(){ host -t txt oo.myaddr.l.google.com 8.8.8.8 | grep -oP "client-subnet \K(\d{1,3}\.){3}\d{1,3}"; } 

Les deux expressions GNU grep (Perl-like -P ) et basic (BRE) sont affichées.

Et, bien sûr, le site d'origine, fonctionnera également.
Avec creuser:

 myip(){ dig myip.opendns.com @208.67.220.222 | grep "^myip\.opendns\.com\." | grep -o "\([0-9]\{1,3\}\.\)\{3\}\([0-9]\{1,3\}\)" ; } 

Et avec l'hôte:

 myip(){ host myip.opendns.com 208.67.220.222 | grep -oP "^myip\.opendns\.com.* \K(\d{1,3}\.){3}(\d{1,3})" ; } 

Les deux extraits ci-dessus fonctionneront avec n'importe laquelle de ces quatre adresses de résolveurs OpenDNS:

 echo 208.67.22{0,2}.22{0,2} 

Si la solution DNS directe échoue à l'avenir, utilisez curl sur l'un de ces sites (urls):

 IFS=$'\n' read -d '' -a urls <<-'_end_of_text_' api.ipify.org bot.whatismyipaddress.com/ canhazip.com/ checkip.dyndns.com/ corz.org/ip curlmyip.com/ eth0.me/ icanhazip.com/ ident.me/ ifcfg.me/ ifconfig.me/ ip.appspot.com/ ipecho.net/plain ipof.in/txt ip.tyk.nu/ l2.io/ip tnx.nl/ip wgetip.com/ whatismyip.akamai.com/ _end_of_text_ 

Appelez une adresse de tableau comme ceci:

 $ i=5; curl -m10 -L "http://${urls[i]}" 116.132.27.203 

Dans certains sites, https peut également fonctionner.

J'ai conclu que plusieurs de ces éléments sont des balises qui peuvent vous identifier à quelqu'un qui renifle votre trafic réseau et / ou le service auquel vous requestz cette information.

Je recommand une requête HTTPS à un service qui protège votre vie privée:

 wget -qqO- 'https://duckduckgo.com/?q=what+is+my+ip' \ | grep -Pow 'Your IP address is \K[0-9.]+' 

(Si vous êtes sur un système embarqué ou un autre système limité et que vous n'avez pas grep -P (libpcre), utilisez
… | grep -ow 'Your IP address is [0-9.]*[0-9]' | grep -ow '[0-9][0-9.]*' … | grep -ow 'Your IP address is [0-9.]*[0-9]' | grep -ow '[0-9][0-9.]*' place).

Si vous (et / ou d'autres personnes sur votre IP) n'utilisez pas le moteur de search consciencieux de DuckDuckGo , alors peut-être même que c'est une balise (bien que votre requête soit elle-même indéchiffrable à une tierce partie, peut- c'est trop?). Vous pouvez faire la même chose avec Google, bien que Google refuse expressément l'access à wget et aux utilitaires similaires, vous devez donc forger votre agent user:

 wget -U Mozilla/5.0 -qqO- 'https://www.google.com/search?q=what+is+my+ip' \ | grep -Po '>\K[0-9.]{7,}(?=<.{0,99}>Your public IP)' 

Cela peut violer les conditions d'utilisation de Google.

On peut supposer que vous devrez changer la class regex de [0-9.] [0-9a-f:] pour IPv6. Je ne sais pas à quoi ça ressemblera si tu es à double stack .