GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu získat svou externí IP adresu v shell skriptu?

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

  1. Protokol odpovědi DNS je standardizován (formát zůstane kompatibilní).
  2. V minulosti 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 se o ně pečuje, než jakákoliv nová hip whatismyip dot-com HTTP služba dnes.
  3. 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 preferovat připojení IPv4 nebo IPv6 konkrétně, 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.

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

POZNÁMKA:Toto je o externích IP adresa (ta, kterou vidí servery na internetu, když se k nim připojíte) – chcete-li interní IP adresa (ta, kterou váš počítač používá pro připojení, která se může lišit) viz tato odpověď .

TL;DR – Nejrychlejší metody v roce 2015

Nejrychlejší metoda využívající DNS:

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

nebo pomocí externalip:

externalip dns

Nejrychlejší pomocí HTTP:

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

nebo pomocí externalip:

externalip http

Nejrychlejší pomocí HTTPS s platným certifikátem:

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

nebo pomocí externalip:

externalip https

Pomocí telnetu:

S nc příkaz:

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

nebo pomocí externalip:

externalip telnet

S telnet příkaz:

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

Pomocí FTP:

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

nebo pomocí externalip:

externalip ftp

Vše výše uvedené lze spustit pomocí mého externího skriptu jako:

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

Teď dlouhý příběh...

Existuje mnoho možností různých serverů poskytujících externí IP, zejména prostřednictvím HTTP, zveřejněných zde nebo jinde.

Udělal jsem benchmark, abych zjistil, zda je některý z nich lepší než ostatní, a výsledky mě překvapily. Např. jeden z nejrozšířenějších doporučovaných ifconfig.me byl pro mě téměř vždy nejpomalejší a odpověď někdy zabrala mnoho sekund. Mnohé nefungují přes HTTPS nebo fungují, ale mají neplatné certifikáty. Některé mají velmi nekonzistentní dobu odezvy.

Srovnávací hodnoty

HTTP a HTTPS

Toto je zdroj mého skriptu externalip-benchmark, který jsem použil:

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

Můžete jej spustit sami, abyste viděli, které služby zde uvedené stojí za to používat:

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

Moje výsledky, které jsem dostal 3. 4. 2015 z Varšavy – adresy byly změněny, aby chránily nevinné:

Nejlepší doby odezvy http:

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'

Nejlepší časy odezvy https:

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

(Poznámka:Některé rychlé odpovědi s prázdným obsahem – ty jsou neplatné.)

Nejlepší průměrné doby pingu:

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/

Zde jsou výsledky, které jsem získal 2015-04-03 z Amsterdamu:

Nejlepší doby odezvy http:

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'

Nejlepší časy odezvy https:

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

Nejlepší průměrné doby pingu:

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/

(999999 pingů znamená 100% ztrátu paketů.)

DNS

Pro srovnání uvádíme časy, které zabírají jiné metody – testováno 16. 6. 2015 ve Varšavě a Amsterdamu.

Použití:

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

obvykle trvá (skutečný čas nástěnných hodin) přibližně:

  • 0,035 s od Varšavy
  • 0,015 s od Amsterdamu

Ve skutečnosti jsou čtyři resolvery, které lze použít tímto způsobem:

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

Všechny poskytují stejnou dobu odezvy ve Varšavě a Amsterdamu, ale v jiných lokalitách tomu tak být nemusí.

Použití 208.67.222.222 – IP adresy resolver1.opendns.com namísto názvu domény je rychlejší:

  • 0,023 s z Varšavy
  • 0,009 s z Amsterdamu

ale nemusí fungovat v budoucnu, pokud se IP někdy změní (ačkoli to může být nepravděpodobné pro dobře známý DNS resolver - možná bych měl použít IP ve svém externalip skriptu - prosím komentujte).

Telnet

Telnet s nc nebo telnet příkaz (viz výše) obvykle trvá:

  • 0,103 s z Varšavy
  • 0,035 s od Amsterdamu

(Mezi nc není žádný znatelný rozdíl a telnet příkazy.)

FTP

  • 0,104 s z Varšavy
  • 0,036 s od Amsterdamu

Názvy domén

Všechny metody budou rychlejší (zejména při prvním spuštění), kdy se místo doménových jmen daných služeb budou používat IP adresy (kromě HTTP, které může používat hostitelské virtuální servery a nepracuje s holou IP - netestováno), ale přestane fungovat, když služby změní IP adresu, takže to může být rychlejší, ale méně odolné do budoucna.

Komentáře

Pokud vidíte nějaké zajímavé výsledky z vaší lokality nebo si myslíte, že by měli být doporučeni někteří jiní hostitelé místo těch, které jsem vybral, napište komentář. Pokud nějaká důležitá služba chybí, napište komentář nebo zveřejněte problém na GitHubu. Rád bych tento příspěvek aktualizoval o aktuální výběr nejvýkonnějších služeb.


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

Místo nahrazeno holandským fungujícím webem.


Linux
  1. Jak získat název distribuce a číslo verze v jednoduchém skriptu Shell?

  2. Jak vytvořit dočasný soubor ve skriptu Shell?

  3. Jak spustit kód v prostředí Django pomocí externího skriptu python?

  1. Jak získat externí IP adresu ve skriptu Shell?

  2. Může být soubor .sh malware?

  3. Jak mohu přeložit název hostitele na IP adresu ve skriptu Bash?

  1. Jak získat vlastní IP adresu a uložit ji do proměnné ve skriptu Shell?

  2. Jak zacházet s přepínači ve skriptu Shell?

  3. Jak nastavit adresu proxy v celém systému pomocí skriptu Shell?