Ich muss meine externe IP-Adresse von einem Shell-Skript finden. Im Moment verwende ich diese Funktion:
myip () {
lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}
Aber es hängt von perl-libwww
ab , perl-html-format
, perl-html-tree
Eingerichtet. Wie kann ich meine externe IP-Adresse sonst noch abrufen?
Akzeptierte Antwort:
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.).
- Das DNS-Antwortprotokoll ist standardisiert (das Format bleibt kompatibel).
- 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.
- 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 aliasieren Sie 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)
...
Der ANY
Der Abfragetyp gibt entweder einen AAAA- oder einen A-Datensatz zurück. Um speziell IPv4- oder IPv6-Verbindungen zu bevorzugen, verwenden Sie -4
oder -6
Optionen entsprechend.
Damit die Antwort eine IPv4-Adresse sein muss, ersetzen Sie ANY durch A
; Ersetzen Sie es 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.
Verwandte Themen:Versuchen Sie, Daten von einem externen RAID-Laufwerk wiederherzustellen?
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