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

273

Ich muss meine externe IP-Adresse aus einem Shell-Skript ermitteln. Im Moment benutze ich diese Funktion:

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

Aber es hängt davon ab perl-libwww, perl-html-format, perl-html-treeinstalliert. Welche anderen Möglichkeiten gibt es, um meine externe IP zu erhalten?

Eugene Yarmash
quelle
8
Was meinst du mit der externen IP? Die beiden bisherigen Antworten verwenden HTTP. Die Antwort ist möglicherweise die IP-Adresse des Proxyservers Ihres Internetdienstanbieters. (Was kann sein, was Sie wollen.)
billpg
@billpg: Ich meine die IP des NAT-Routers
Eugene Yarmash
Dann benötigen Sie einen What-is-my-IP-Webdienst, der HTTPS verwendet. Leider kenne ich keine.
billpg
1
@billpg ipcheckit.com
Gilles
checkip.amazonaws.com verwenden dies von bekannten Anbieter
arulraj.net

Antworten:

441

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

Die meisten anderen Antworten beziehen sich auf das Übermitteln von HTTP an einen Remoteserver. Einige von ihnen mussten die Ausgabe analysieren oder stützten sich auf den User-Agent-Header, damit der Server im Klartext antwortete. Diese ändern sich ziemlich häufig (gehen Sie runter, ändern Sie ihren Namen, schalten Sie Anzeigen, ändern Sie möglicherweise das Ausgabeformat usw.).

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

Verwendung digmit OpenDNS als Resolver:

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

Vielleicht auch als Alias ​​in Ihrem, bashrcso dass Sie sich leicht daran erinnern können

alias wanip='dig @resolver1.opendns.com ANY myip.opendns.com +short'

Antwortet mit einer einfachen IP-Adresse:

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

Der ANYAbfragetyp gibt entweder einen AAAA- oder einen A-Datensatz zurück. Verwenden Sie die Optionen -4oder , um IPv4- oder IPv6-Verbindungen speziell zu bevorzugen -6.

Wenn die Antwort eine IPv4-Adresse sein soll, ersetzen Sie ANY durch A; Ersetzen Sie IPv6 durch AAAA.Bitte 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 und Beispiele

Neben OpenDNS gibt es ähnliche DNS-Dienste von Akamai und 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"

Beispielalias, der speziell eine IPv4-Adresse anfordert:

alias wanip4='dig @resolver1.opendns.com A myip.opendns.com +short -4'

$ wanip4
80.100.192.168

Und für IPv6:

alias wanip6='dig @resolver1.opendns.com AAAA myip.opendns.com +short -6'

$ wanip6
2606:4700:4700::1111

Fehlerbehebung

Wenn der Befehl aus irgendeinem Grund nicht funktioniert, liegt möglicherweise ein Problem mit dem Upstream-Anbieter, dem Befehlszeilentool oder etwas anderem vor. Führen Sie den Befehl ohne die +shortOption zum Anzeigen der Details der DNS-Abfrage aus, um zu verstehen, warum er nicht funktioniert . Zum Beispiel:

$ 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
quelle
18
Sie haben Recht, es ist zu schnell ..
Rahul Patil
4
@Krinkle das ist eine hervorragende Antwort. Gibt es eine Entsprechung für myip.opendns.comin Googles Public DNS?
Kannan Mohan
12
Ich fand das ~ 19x schneller als curl http://canhazip.com. Siehe askubuntu.com/a/427092/2273
Adam Monsen
3
Ich
5
Bitte beachten Sie, dass in einigen Fällen die Router, die NAT bereitstellen, auch DNS-Antworten übersetzen (siehe wiki.nil.com/Network_address_translation_of_DNS_responses ). In diesem Fall sollten Sie auf eine Antwort zurückgreifen, die einen anderen Ansatz als DNS empfiehlt.
Razvan Stefanescu
146

Hinweis: Dies ist über externe IP - Adresse (die, die die Server im Internet sehen , wenn Sie mit ihnen verbinden) - wenn Sie möchten , interne IP - Adresse (die, die Ihren eigenen Computer für Verbindungen verwendet, die unterschiedlich sein können) sehen diese antworte .

TL; DR - Schnellste Methoden im Jahr 2015

Die schnellste Methode mit DNS:

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

oder mit externalip :

externalip dns

Am schnellsten über HTTP:

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

oder mit externalip:

externalip http

Die schnellste Verwendung von HTTPS mit einem gültigen Zertifikat:

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

oder mit externalip:

externalip https

Verwendung von Telnet:

Mit ncBefehl:

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

oder mit externalip:

externalip telnet

Mit telnetBefehl:

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

Verwendung von FTP:

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

oder mit externalip:

externalip ftp

Alle oben genannten Funktionen können mit meinem externalip- Skript ausgeführt werden als:

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

Nun eine lange Geschichte ...

Es gibt eine Vielzahl von Optionen für verschiedene Server, die die externe IP bereitstellen, insbesondere über HTTP, das hier oder anderswo veröffentlicht wird.

Ich habe einen Benchmark erstellt, um festzustellen, ob einer von ihnen besser ist als die anderen, und ich war von den Ergebnissen überrascht. ZB war eine der am häufigsten empfohlenen ifconfig.me-Dateien für mich fast immer die langsamste. Manchmal dauerte es viele Sekunden, bis ich antwortete. Viele arbeiten nicht über HTTPS oder haben ungültige Zertifikate. Einige haben sehr inkonsistente Antwortzeiten.

Benchmarks

HTTP und HTTPS

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

Sie können es selbst ausführen, um zu sehen, welche der hier genannten Dienste es wert sind, verwendet 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 geändert, um die Unschuldigen zu schützen:

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 Pingzeiten:

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 Pingzeiten:

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 Zeiten, die andere Methoden am 16.06.2015 aus Warschau und Amsterdam erprobt haben.

Verwenden von:

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

In der Regel dauert (echte Wanduhrzeit) etwa:

  • 0.035s von Warschau
  • 0.015s von Amsterdam

Es gibt tatsächlich vier Resolver, 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 alle die gleichen Antwortzeiten an, in anderen Ländern ist dies jedoch möglicherweise nicht der Fall.

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

  • 0.023s von Warschau
  • 0.009s von Amsterdam

Sollte sich die IP jemals ändern, funktioniert dies möglicherweise in Zukunft nicht mehr (obwohl dies für einen bekannten DNS-Resolver unwahrscheinlich ist - möglicherweise sollte ich die IP in meinem externalip- Skript verwenden - bitte kommentieren).

Telnet

Telnet mit ncoder telnetBefehl (so) benötigt normalerweise:

  • 0.103s aus Warschau
  • 0.035s von Amsterdam

(Es gibt keinen merklichen Unterschied zwischen ncund telnetBefehlen.)

FTP

  • 0.104s aus Warschau
  • 0.036s von Amsterdam

Domain Namen

Alle Methoden sind schneller (insbesondere bei der ersten Ausführung), wenn IP-Adressen anstelle der Domänennamen der angegebenen Dienste verwendet werden (mit Ausnahme von HTTP, das hostbasierte virtuelle Server verwenden kann und nicht mit nackter IP funktioniert - nicht getestet), funktioniert jedoch nicht mehr, wenn die Dienste die IP-Adresse ändern, sodass sie möglicherweise schneller, aber weniger zukunftssicher ist.

Bemerkungen

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

rsp
quelle
2
Haben Sie die myip.opendns.comDNS-Methode mit der von Krinkle verglichen ? Derzeit scheint es, dass dies standardmäßig der Gewinner ist, da keine anderen Anbieter für diese Methode bekannt sind. Ein Vergleich mit den anderen Methoden ist jedoch weiterhin sinnvoll.
James Haigh
@ JamesHaigh Danke für den Vorschlag. Ich habe DNS und andere Methoden (Telnet, FTP) zur Antwort hinzugefügt. Die schnellste Methode scheint DNS zu sein, das direkt die IP-Adresse (anstelle des Domainnamens) des Resolvers verwendet.
rsp
Sie sollten auch canhazip.com / canhazip.com hinzufügen / testen (HTTP und HTTPS).
xxdesmus
Sie können myip.addr.space zu Ihrer Liste hinzufügen . Ich habe das selbst gebaut, da ich mit keinem der anderen, die ich damals gesehen hatte, besonders zufrieden war.
Michael Hampton
Manchmal erhalte ich mit 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) und curl http://canhazip.com(36.71.64.71) unterschiedliche Ergebnisse . Wie kann ich entscheiden, welche richtig ist?
Sutandiono
80
 curl -s http://whatismijnip.nl |cut -d " " -f 5

Site durch holländische funktionierende Site ersetzt.

Maciek Sawicki
quelle
3
+1 Ich wusste von whatismyip.com, aber nicht von whatismyip.org, das ist großartig.
Julian
Ich wusste nie davon! Tolle Seite!
bbosak
2
@MaciekSawicki Ist die -sOption in diesem Fall wirklich notwendig? Ich habe es mit / ohne Fedora 15 - Bash 4.2.10 (1) versucht und es hat in beide Richtungen funktioniert.
ztank1013
4
Scheint nicht mehr über CLI zu funktionieren, aber das Aufrufen der Webseite über einen Webbrowser funktioniert. Ich verwende openSUSE 12.1 x64.
SaultDon
5
whatismyip.comhat den kostenlosen Dienst zur Überprüfung der externen IP entfernt. Ich fürchte, das ist nicht mehr richtig. icanhazip.comfunktioniert noch.
DaSong
54

Da whatsmyip.org und ifconfig.me bereits erwähnt wurden:

curl -s icanhazip.com
joschi
quelle
4
Eine andere: ip.appspot.com oder ip.appspot.com
Lekensteyn
1
Diese beiden unterstützen IPv6.
Josh Lee
1
@JoshLee, beachte, dass icanhazip auch ipv6 unterstützt. Auch eine Anmerkung zum OP, alle diese curlLösungen (obwohl gültig) hängen noch von einer externen Bibliothek ab ( libcurl).
HalosGhost
Eine andere: ifcfg.me
Eun
18

Sie können ifconfig.me als Alternative zu whatismyip.org verwenden.

curl -s http://ifconfig.me

Auch ifconfig.me hat einige zusätzliche Funktionen. Um herauszufinden, welche weiteren Informationen Sie erhalten können, besuchen Sie die Website.

Mr. Deathless
quelle
5
Es ist extrem langsam . Ich bekomme oft Antwortzeiten über 30 Sekunden, manchmal sogar über eine Minute! Manchmal ist es eine halbe Sekunde (was immer noch viel ist) und dann sind es 15 Sekunden oder so. Dies wird an verschiedenen Orten getestet. Weitere Informationen und Benchmarks finden
rsp
15
wget -O - -q http://whatismyip.org/
ztank1013
quelle
3
Ich war nicht in der Lage, meine IP wie <img src='ipimg.php'/>
folgt
Ich habe es mit ein bisschen Regex-Magie versucht, aber es war nicht einfach. Wenn Sie darauf bestehen, diesen Dienst zu nutzen, müssen Sie diese Zeile in ein Skript $ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
einbinden
13

Amazon AWS

curl https://checkip.amazonaws.com

Beispielausgabe:

123.123.123.123

Ich mag es weil:

  • es gibt nur die Klartext-IP zurück, sonst nichts
  • Es stammt von einem bekannten Anbieter, der wahrscheinlich nicht so schnell offline gehen wird
Ciro Santilli ist ein Schauspieler
quelle
9

Ich bevorzuge curlmyip.com Es ist so einfach wie:

curl curlmyip.com

Es ist kurz und einfach zu merken.

Garrett Fogerlie
quelle
Bei der Verwendung in bash- der Absicht des OP - können Sie nicht auf die -sin anderen Antworten erwähnte Option verzichten.
Serge Stroobandt
3
@SergeStroobandt Ja, das kannst du. Der -sSwitch führt ihn nur im unbeaufsichtigten Modus aus, d. H. Fehlermeldungen werden nicht angezeigt. Es kommt also darauf an, wie sein Skript mit Fehlern umgehen soll. Der Befehl selbst gibt genauso zuverlässig eine IP-Adresse zurück wie der Befehl -s.
Garrett Fogerlie
1
Bisher war diese Site die zuverlässigste in mehreren Tests.
Amos Shapira
9
curl ident.me

ODER

curl ifconfig.me

ODER

curl tnx.nl/ip

ODER

curl ipecho.net/plain

ODER

curl ip.appspot.com

ODER

curl whatismyip.akamai.com

ODER

curl icanhazip.com

ODER

curl wgetip.com

ODER

curl ip.tyk.nu

ODER

curl curlmyip.com

ODER

curl corz.org/ip

ODER

curl bot.whatismyipaddress.com

Referenz

Mandar Shinde
quelle
6
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1
Eugene Yarmash
quelle
Leere Ausgabe hier, obwohl die Site funktioniert. Irgendeine Idee warum? Ich bin hinter einem Proxy, wenn das relevant ist, aber wget icanhazip.comfunktioniert.
l0b0
@ l0b0 Versuchen Sie, den | tail -n1Teil wegzulassen und zu sehen, was Sie vom Proxy erhalten
Eugene Yarmash
Nichts, nur Exit-Code 1. Das Gleiche gilt für netcat icanhazip.com 80. Sieht so aus, als würde es ignoriert $http_proxyund Freunde, weil das Angeben des Proxys und des Ports mit -xnur zu einem hängenden Prozess geführt hat.
l0b0
@ l0b0: netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1Für einen einfachen HTTP-Proxy (vorausgesetzt, er wird auf Port 3128 ausgeführt). Die IP-Adresse des Proxys erhalten Sie natürlich zurück.
Tripleee
1
HTTP 1.0 verfügt nicht über den Host:Anforderungsheader. Das namensbasierte virtuelle Hosting war eine der wichtigsten Verbesserungen in HTTP 1.1. Ändern Sie entweder die Anforderung, um HTTP / 1.1 anzugeben, oder entfernen Sie den Host-Header (ich empfehle den ersteren).
ein Lebenslauf
4

Wenn Sie nach dem Lesen all dieser Vorschläge noch mehr lesen möchten, finden Sie hier ein wohl überarbeitetes Bash-Skript.

Es enthält eine Liste von DNS- und HTTP-Servern, die anscheinend ab Februar 2017 einwandfrei funktionieren.

Wenn ja dig, versucht es zuerst DNS, das fast eine Größenordnung schneller ist als die verschiedenen HTTP-Dienste.

Es wird bei der ersten Antwort beendet, die es erhält.

Wenn dies nicht der Fall ist digoder wenn alle DNS-Server ausgefallen sind, werden die HTTP-Dienste überprüft, bis eine Antwort eingeht.

Die Server sind alphabetisch aufgelistet, werden jedoch vor der Verwendung gemischt, um zu vermeiden, dass immer derselbe verwendet wird.

#!/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

Anwendungsbeispiel (ich habe das Skript aufgerufen 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'

Kommentieren Sie die verboseVariable oben im Skript aus, um zu vermeiden, dass der verwendete Server gedruckt wird.

Update: Dieses Skript ist jetzt auch auf Github verfügbar, wo ich es bei Bedarf aktualisieren kann:
https://github.com/mivk/myip

mivk
quelle
3

Wenn Sie HTTPS verwenden möchten, um einige potenzielle Fallstricke zu vermeiden:

_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"
Chris Down
quelle
2
Vielleicht könnten Sie erläutern, welche potenziellen Gefahren Sie hier vermeiden?
Caleb
Die Domain ipcheckit.com steht offenbar zum Verkauf und hostet den IP-Adress-Anzeigedienst nicht mehr.
Manatwork
ah, die Tücken der schreibgeschützten Skripte :)
Ярослав Рахматуллин
@Chris Da die Technik immer noch gültig ist, benötigen Sie nur eine andere SSL-fähige Site, um sie zu verwenden.
Caleb
3

Hier ist eine weitere Alternative, die von Hosts abhängt, deren Geschäft sich um die Verwaltung dynamischer IP-Adressen dreht, und nicht um "öffentliche" Websites, die möglicherweise nicht mehr funktionieren oder das Format ändern.

  1. Registrieren Sie Ihren Server bei einem der vielen kostenlosen dynamischen DNS-Dienste (z. B. no-ip.com). Dadurch erhalten Sie einen DNS-Eintrag wie xxx.no-ip.org.
  2. Installieren Sie das dynamische Aktualisierungstool des Dienstes (meldet IP-Änderungen an den Dienst).

Gehen Sie wie folgt vor, um die IP-Adresse in einem Skript abzurufen:

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

Hervorragend für die Verwendung in Cron-Jobs geeignet, um zu überprüfen, ob sich die dynamische IP geändert hat und einige Konfigurationseinträge geändert werden müssen.

cgmonroe
quelle
3

Das funktioniert immer bei mir, ich benutze es in meinem conky, um meine IP-Adresse zu bekommen.

wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'
Dai_Trying
quelle
+1 Auch wenn dieser Ansatz so ungeschickt aussieht, hat er mir ein paar Mal das Leben gerettet. Weil das Internet kein WWW ist . Sie können über einen Internetzugang verfügen, sind jedoch möglicherweise (normalerweise in Serverräumen) dazu verdammt, eine Konsole ohne grafische Benutzeroberfläche zu verwenden. In diesem Fall ist es wichtig, sich eine der URLs des checkIP-Diensts auswendig zu merken. Und da dies ziemlich häufig ist, ist es nur scheinbar kompiliert, da Sie sich mit größerer Wahrscheinlichkeit an das DynDNS erinnern werden als an das von amazonaws. Das heißt, wenn Sie KEINE Möglichkeit haben, danach zu googeln. (nicht einmal lynx).
Syntaxfehler
3

Da ich nicht auf die Verbindung oder den Dienst angewiesen bin, verwende ich den folgenden Code, mit dem versucht wird, die IP mithilfe verschiedener Dienste abzurufen (Sie können auch weitere hinzufügen):

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

Um die Robustheit zu erhöhen (z. B. wenn einer der Dienste sein Format ändert), können Sie $IPmithilfe der folgenden Funktion überprüfen, ob es sich um eine gültige IP-Adresse handelt :

# 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
quelle
3

ifcfg.me unterstützt:

curl ifcfg.me
nslookup . ifcfg.me
telnet ifcfg.me
ftp ifcfg.me
finger @ifcfg.me

IPv4 und IPv6, noch mehr Sachen mit Curl: ifcfg.me/?

Eun
quelle
In welcher nslookupBeziehung steht die Methode zur digMethode in Krinkles Antwort ? Sie benutzen beide DNS, richtig? Kann ich also eine Option zum digAbrufen desselben DNS-Eintrags übergeben, nslookupder hier ausgeführt wird?
James Haigh
Ja, Sie könnten verwenden, dig +short . @ifcfg.mewenn Sie möchten
Eun
2

Ich betreibe einen Cloud-Dienst für meine Familie und habe dieses schnelle Skript erstellt, das ich cronjeden Morgen um 5 Uhr ausführe, weil ich billig bin und keine statische IP kaufe.

Es erfasst die öffentliche IP und sendet sie per E-Mail an meine Benutzer. Es wurde eine E-Mail im Hyperlink-Format erstellt, sodass meine Mutter die Ports oder etwas anderes nicht eingeben muss. Vielleicht kann jemand anderes damit umgehen.

#!/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
Wille
quelle
1

Dies zeigt die aktuelle IP-Adresse in einem Popup-Fenster an:

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

Ich habe einen Dienst eingerichtet, der die IP-Adresse als JSON / XML oder Nur-Text zurückgibt. Sie finden sie hier

http://ipof.in/txt

Dieselbe URL mit / json und / xml gibt Ihnen auch andere Formate

Wenn Sie HTTPS möchten, können Sie dieselben URLs mit dem Präfix https verwenden. Der Vorteil ist, dass Sie die öffentliche Adresse erhalten, auch wenn Sie in einem Wifi sind.

Ein einfacher Alias ​​myip = "curl https://ipof.in/txt " wird Ihre IP erhalten

vivekv
quelle
1

Alternativ können Sie STUN verwenden, das erfunden wurde, um diese Frage automatisiert zu beantworten und in der Internetkommunikation, z. B. von SIP und WebRTC, häufig verwendet wird .

Mit einem Stunclient (unter debian / ubuntu do apt-get install stuntman-client) machen Sie einfach:

$ stunclient stun.services.mozilla.com
Binding test: success
Local address: A.B.C.D:42541
Mapped address: W.X.Y.Z:42541

Wo A.B.C.Dist die IP-Adresse Ihres Rechners im lokalen Netz und wo W.X.Y.Zsind die IP-Adressenserver, die Websites von außen sehen (und die, die Sie suchen)? Mit können sedSie die Ausgabe oben auf nur eine IP-Adresse reduzieren:

stunclient stun.services.mozilla.com |
    sed -ne "s/^Mapped address: \(.*\):.*$/\1/p"

Eine alternative STUN-Suche mit nur grundlegenden Befehlszeilentools finden Sie in meiner Antwort auf AskUbuntu (gedacht als unterhaltsame Übung, nicht für den produktiven Gebrauch).

Victor Klos
quelle
0

Der w3m Plaintext-Browser eignet sich hervorragend für die Bash. Sie können grepund verwenden tail, um die Antwort wie folgt zu verkürzen:

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

Verwenden Sie curl, um auf den IP-Service von shtuff.it zuzugreifen

curl -s https://shtuff.it/myip/short
Chris Montanaro
quelle
301 Permanent
umgezogen
Der Link ist jetzt tot
Eugene Bujak
0

Die Verwendung einer DNS-Anfrage auch hinter einem NAT-Router, der DNS-Adressen übersetzt, kann folgendermaßen funktionieren:

$ dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com | cut -d'"' -f2
x.y.z.t

Alternativ können Sie auch die HTTP-Anforderungsmethode verwenden:

$ curl -s ipinfo.io/ip
x.y.z.t
SebMa
quelle
1
Warum würden Sie eine über die andere empfehlen?
Roaima
@roaima Du hast recht, es liegt an jedem Benutzer zu entscheiden.
SebMa