Potřebuji najít svou externí IP adresu ze skriptu shellu. V tuto chvíli používám tuto funkci:
myip () {
lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}
Ale záleží na perl-libwww
, perl-html-format
, perl-html-tree
nainstalováno. Jaké další způsoby mohu získat svou externí IP?
Přijatá odpověď:
Doporučuji získat jej přímo ze serveru DNS.
Většina ostatních odpovědí níže zahrnuje přechod přes HTTP na vzdálený server. Některé z nich vyžadovaly analýzu výstupu nebo se spoléhaly na hlavičku User-Agent, aby server odpověděl v prostém textu. Ty se mění poměrně často (sestupte dolů, změňte jejich jméno, zobrazujte reklamy, mohou změnit výstupní formát atd.).
- Protokol odpovědi DNS je standardizován (formát zůstane kompatibilní).
- Historicky mají služby DNS (Akamai, Google Public DNS, OpenDNS, ..) tendenci přežívat mnohem déle a jsou stabilnější, škálovatelnější a obecně více opečovávané než jakákoliv nová hip whatismyip dot-com HTTP služba dnes.
- Tato metoda je ze své podstaty rychlejší (byť jen o několik milisekund!).
Pomocí dig
s OpenDNS resolverem:
$ dig @resolver4.opendns.com myip.opendns.com +short
Možná alias ve vašem bashrc
takže je snadno zapamatovatelné
# 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'
Odpoví obyčejnou IP adresou:
$ wanip # wanip4, or wanip6
80.100.192.168 # or, 2606:4700:4700::1111
Syntaxe
(Zkráceno z 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)
...
ANY
Typ dotazu vrátí záznam AAAA nebo A. Chcete-li konkrétně preferovat připojení IPv4 nebo IPv6, použijte -4
nebo -6
odpovídající možnosti.
Chcete-li, aby odpověď byla adresa IPv4, nahraďte ANY za A
; pro IPv6 jej nahraďte AAAA
. Všimněte si, že může vrátit pouze adresu použitou pro připojení. Například při připojení přes IPv6 nemůže vrátit adresu A.
Alternativní servery
Tuto službu nabízejí různí poskytovatelé DNS, včetně OpenDNS, Akamai a 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"
Příklad aliasu, který konkrétně požaduje adresu IPv4:
# https://unix.stackexchange.com/a/81699/37512
alias wanip4='dig @resolver4.opendns.com myip.opendns.com +short -4'
$ wanip4
80.100.192.168
A pro vaši adresu IPv6:
# 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"
Odstraňování problémů
Pokud příkaz z nějakého důvodu nefunguje, může být problém se sítí. Nejprve vyzkoušejte jednu z výše uvedených alternativ.
Související:Pokoušíte se obnovit data z externího disku RAID?
Pokud máte podezření na jiný problém (s poskytovatelem upstream, nástrojem příkazového řádku nebo něčím jiným), spusťte příkaz bez +short
možnost odhalit podrobnosti dotazu DNS. Například:
$ 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