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

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

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

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

Linux
  1. Wie bekomme ich den Namen des aktuellen Git-Zweigs in eine Variable in einem Shell-Skript?

  2. Wie bekomme ich den Inhalt einer Webseite in eine Shell-Variable?

  3. So erhalten Sie die PID von einem gegabelten untergeordneten Prozess im Shell-Skript

  4. Wie erhalte ich den Exit-Code des erzeugten Prozesses im erwarteten Shell-Skript?

  5. Rufen Sie die MAC-Adresse mit Shell-Skript ab

So verwenden Sie Variablen in Shell-Skripten

So erhalten Sie Ihre IP-Adresse unter Linux

Wie erhalte ich Beschreibungen der verfügbaren `shopt`-Optionen?

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

Wie bekomme ich den PYTHONPATH in der Shell?

Wie führe ich Code in der Django-Shell durch ein externes Python-Skript aus?