GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich meine externe IP-Adresse in einem Shell-Skript abrufen?

Ich würde empfehlen, es direkt von einem DNS-Server zu beziehen.

Bei den meisten anderen Antworten unten geht es über HTTP zu einem Remote-Server. Einige von ihnen erforderten das Parsen der Ausgabe oder verließen sich auf den User-Agent-Header, damit der Server im Klartext antwortet. Diese ändern sich ziemlich häufig (gehen nach unten, ändern ihren Namen, schalten Anzeigen, ändern möglicherweise das Ausgabeformat usw.).

  1. Das DNS-Antwortprotokoll ist standardisiert (das Format bleibt kompatibel).
  2. In der Vergangenheit haben DNS-Dienste (Akamai, Google Public DNS, OpenDNS usw.) in der Regel viel länger überlebt und sind stabiler, skalierbarer und im Allgemeinen gepflegter als jeder neue angesagte whatismyip dot-com-HTTP-Dienst, der angesagt ist heute.
  3. Diese Methode ist von Natur aus schneller (und sei es nur um wenige Millisekunden!).

Mit dig mit einem OpenDNS-Resolver:

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

Vielleicht alias es in Ihrem bashrc so ist es leicht zu merken

# 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'

Antwortet mit einer einfachen IP-Adresse:

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

Syntax

(Abgekürzt von 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)
             ...

Die ANY Der Abfragetyp gibt entweder einen AAAA- oder einen A-Datensatz zurück. Um speziell IPv4- oder IPv6-Verbindungen zu bevorzugen, verwenden Sie den -4 oder -6 Optionen entsprechend.

Damit die Antwort eine IPv4-Adresse sein muss, ersetzen Sie ANY durch A; Ersetzen Sie ihn für IPv6 durch AAAA . Beachten Sie, dass nur die für die Verbindung verwendete Adresse zurückgegeben werden kann. Wenn Sie beispielsweise eine Verbindung über IPv6 herstellen, kann die A-Adresse nicht zurückgegeben werden.

Alternative Server

Verschiedene DNS-Anbieter bieten diesen Dienst an, darunter OpenDNS, Akamai und 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"

Beispiel-Alias, der speziell eine IPv4-Adresse anfordert:

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

$ wanip4
80.100.192.168

Und für Ihre IPv6-Adresse:

# 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"

Fehlerbehebung

Wenn der Befehl aus irgendeinem Grund nicht funktioniert, liegt möglicherweise ein Netzwerkproblem vor. Probieren Sie zuerst eine der oben genannten Alternativen aus.

Wenn Sie ein anderes Problem vermuten (mit dem Upstream-Anbieter, dem Befehlszeilentool oder etwas anderem), führen Sie den Befehl ohne +short aus Option, um die Details der DNS-Abfrage anzuzeigen. Zum Beispiel:

$ 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

HINWEIS:Hier geht es um externe IP-Adresse (diejenige, die die Server im Internet sehen, wenn Sie sich mit ihnen verbinden) – wenn Sie intern möchten IP-Adresse (diejenige, die Ihr eigener Computer für Verbindungen verwendet, die unterschiedlich sein kann) siehe diese Antwort .

TL;DR - Schnellste Methoden 2015

Die schnellste Methode mit DNS:

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

oder mit externalip:

externalip dns

Am schnellsten mit HTTP:

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

oder mit externalip:

externalip http

Am schnellsten mit HTTPS mit gültigem Zertifikat:

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

oder mit externalip:

externalip https

Mit Telnet:

Mit nc Befehl:

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

oder mit externalip:

externalip telnet

Mit telnet Befehl:

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

Mit FTP:

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

oder mit externalip:

externalip ftp

Alles Obige kann mit meinem externalip-Skript ausgeführt werden als:

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

Nun eine lange Geschichte...

Es gibt viele Optionen von verschiedenen Servern, die die externe IP bereitstellen, insbesondere über HTTP, die hier oder anderswo gepostet werden.

Ich habe einen Benchmark gemacht, um zu sehen, ob einer von ihnen besser ist als die anderen, und ich war von den Ergebnissen überrascht. Z.B. Eines der am häufigsten empfohlenen ifconfig.me war für mich fast immer das langsamste und brauchte manchmal viele Sekunden, um zu antworten. Viele funktionieren nicht über HTTPS oder funktionieren, haben aber ungültige Zertifikate. Einige haben sehr inkonsistente Antwortzeiten.

Benchmarks

HTTP und HTTPS

Dies ist die Quelle meines Externalip-Benchmark-Skripts, das ich verwendet habe:

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

Sie können es selbst ausführen, um zu sehen, welche der hier erwähnten Dienste es wert sind, genutzt zu werden:

wget https://raw.githubusercontent.com/rsp/scripts/master/externalip-benchmark
chmod a+x externalip-benchmark
./externalip-benchmark

Meine Ergebnisse, die ich am 03.04.2015 aus Warschau erhalten habe - die Adressen wurden zum Schutz der Unschuldigen geändert:

Beste HTTP-Antwortzeiten:

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'

Beste https-Antwortzeiten:

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=''

(Hinweis:Es gibt einige schnelle Antworten mit leerem Inhalt - diese sind ungültig.)

Beste durchschnittliche Ping-Zeiten:

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/

Hier sind die Ergebnisse, die ich am 03.04.2015 aus Amsterdam erhalten habe:

Beste HTTP-Antwortzeiten:

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'

Beste https-Antwortzeiten:

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=''

Beste durchschnittliche Ping-Zeiten:

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/

(Die 999999 Pings bedeuten 100 % Paketverlust.)

DNS

Zum Vergleich hier mal andere Methoden nehmen - getestet am 16.06.2015 aus Warschau und Amsterdam.

Verwendung:

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

dauert normalerweise (reale Uhrzeit) etwa:

  • 0,035 s von Warschau
  • 0,015 s von Amsterdam

Eigentlich sind es vier Auflöser, die auf diese Weise verwendet werden können:

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

In Warschau und Amsterdam geben sie alle die gleichen Antwortzeiten, aber an anderen Standorten ist dies möglicherweise nicht der Fall.

Die Verwendung von 208.67.222.222 - die IP von resolver1.opendns.com anstelle des Domänennamens ist schneller:

  • 0,023 s von Warschau
  • 0,009 Sek. von Amsterdam

funktioniert aber möglicherweise in Zukunft nicht, wenn sich die IP jemals ändert (obwohl es für einen bekannten DNS-Resolver unwahrscheinlich sein kann - vielleicht sollte ich die IP in meinem Externalip-Skript verwenden - bitte kommentieren).

Telnet

Telnet mit nc oder telnet Befehl (siehe oben) dauert normalerweise:

  • 0,103 Sekunden von Warschau
  • 0,035 s von Amsterdam

(Es gibt keinen merklichen Unterschied zwischen nc und telnet Befehle.)

FTP

  • 0,104 s von Warschau
  • 0,036 s von Amsterdam

Domainnamen

Alle Methoden sind schneller (insbesondere wenn sie zum ersten Mal ausgeführt werden), wenn IP-Adressen anstelle der Domänennamen der angegebenen Dienste verwendet werden (außer bei HTTP, das hostbasierte virtuelle Server verwenden kann und nicht mit bloßem IP funktioniert - nicht getestet), funktioniert aber nicht mehr, wenn die Dienste die IP-Adresse ändern, sodass es möglicherweise schneller, aber weniger zukunftssicher ist.

Kommentare

Wenn Sie einige interessante Ergebnisse von Ihrem Standort sehen oder wenn Sie der Meinung sind, dass andere Hosts anstelle der von mir ausgewählten empfohlen werden sollten, posten Sie bitte einen Kommentar. Wenn ein wichtiger Dienst fehlt, kommentieren oder posten Sie ein Problem auf GitHub. Ich möchte diesen Beitrag mit einer aktuellen Auswahl der leistungsstärksten Dienste auf dem Laufenden halten.


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

Website durch eine funktionierende niederländische Website ersetzt.


Linux
  1. Wie erhalte ich die externe IP-Adresse in einem Shell-Skript?

  2. Wie erhalte ich die eigene IP-Adresse und speichere sie in einer Variablen in einem Shell-Skript?

  3. Wie behandelt man Schalter in einem Shell-Skript?

  4. Wie erstelle ich eine temporäre Datei im Shell-Skript?

  5. So legen Sie eine systemweite Proxy-Adresse mit Shell-Skript fest

So verwenden Sie Variablen in Shell-Skripten

So finden / erhalten Sie Ihre IP-Adresse unter Linux

So erstellen Sie Shell-Skripte

So erhalten Sie Ihre IP-Adresse unter Linux

Wie erhalte ich den Distributionsnamen und die Versionsnummer in einem einfachen Shell-Skript?

Wie führe ich einen Befehl in einem Shell-Skript aus?