Jak mogę uzyskać mój zewnętrzny adres IP w skrypcie powłoki?


273

Potrzebuję znaleźć mój zewnętrzny adres IP ze skryptu powłoki. W tej chwili korzystam z tej funkcji:

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

Ale to zależy od tego perl-libwww, perl-html-format, perl-html-treezainstalowany. Jakie inne sposoby mogę uzyskać moje zewnętrzne IP?


8
Co rozumiesz przez zewnętrzny adres IP? Dwie dotychczasowe odpowiedzi wykorzystują HTTP. Odpowiedzią może być adres IP serwera proxy twojego dostawcy usług internetowych. (Co może być tym, czego chcesz.)
billpg

@billpg: Mam na myśli adres IP routera NAT
Eugene Yarmash

Będziesz wtedy potrzebować usługi sieciowej typu „co to jest moje IP”, która korzysta z HTTPS. Niestety, nie znam żadnego.
billpg

1
@billpg ipcheckit.com
Gilles

checkip.amazonaws.com korzysta z tego od znanego dostawcy
arulraj.net

Odpowiedzi:


441

Polecam pobieranie go bezpośrednio z serwera DNS.

Większość pozostałych poniższych odpowiedzi dotyczy przejścia przez HTTP na zdalny serwer. Niektóre z nich wymagały parsowania danych wyjściowych lub polegały na nagłówku User-Agent, aby serwer odpowiadał zwykłym tekstem. Te zmieniają się dość często (zejdź na dół, zmień nazwę, umieść reklamy, mogą zmienić format wyjściowy itp.).

  1. Protokół odpowiedzi DNS jest ustandaryzowany (format pozostanie kompatybilny).
  2. Historycznie, usługi DNS ( OpenDNS , Google Publiczny DNS , ..) mają tendencję do przetrwania znacznie dłużej i są bardziej stabilne, skalowalne i ogólnie bardziej zadbane niż jakakolwiek nowa, popularna dziś usługa HTTP whatismyip.com.
  3. Ta metoda jest z natury szybsza (choćby o kilka milisekund!).

Korzystanie digz OpenDNS jako resolvera:

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

Być może jest to alias w twoim, bashrcwięc łatwo je zapamiętać

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

Odpowiada zwykłym adresem IP:

$ wanip
80.100.192.168 # or, 2606:4700:4700::1111

Składnia

(Skrót od 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)
             ...

Typ ANYzapytania zwraca rekord AAAA lub A. Aby preferować połączenie IPv4 lub IPv6, użyj odpowiednio opcji -4lub -6.

Aby wymagać odpowiedzi, należy podać adres IPv4, zamień DOWOLNY na A; w przypadku IPv6 zamień go na. AAAAUwaga: może zwrócić tylko adres użyty do połączenia. Na przykład podczas łączenia przez IPv6 nie może zwrócić adresu A.

Alternatywne serwery i przykłady

Oprócz OpenDNS istnieją podobne usługi DNS oferowane przez Akamai i 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"

Przykładowy alias, który konkretnie żąda adresu IPv4:

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

$ wanip4
80.100.192.168

A dla IPv6:

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

$ wanip6
2606:4700:4700::1111

Rozwiązywanie problemów

Jeśli polecenie z jakiegoś powodu nie działa, może występować problem z dostawcą, narzędziem wiersza polecenia lub czymś innym. Aby zrozumieć, dlaczego nie działa, uruchom polecenie bez +shortopcji ujawnienia szczegółów zapytania DNS. Na przykład:

$ 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

18
masz rację, jest za szybko ..
Rahul Patil

4
@ Krinkle to doskonała odpowiedź. Czy istnieje odpowiednik myip.opendns.compublicznego DNS w Google?
Kannan Mohan

12
Odkryłem, że jest to ~ 19x szybciej niż curl http://canhazip.com. Zobacz askubuntu.com/a/427092/2273
Adam Monsen

3
Uwielbiam to czyste / brak zależności zbliża się znacznie lepiej niż wszystkie inne propozycje, chyba że jesteś zobowiązany do portu 80
binarnie

5
Należy pamiętać, że w niektórych przypadkach routery, które zapewniają NAT, będą również tłumaczyć odpowiedzi DNS (możesz zajrzeć na wiki.nil.com/Network_address_translation_of_DNS_respactions ); w takim przypadku powinieneś powrócić do odpowiedzi, która zaleca inne podejście niż DNS.
Razvan Stefanescu

146

UWAGA: Chodzi o zewnętrzny adres IP (ten, który widzą serwery w Internecie podczas łączenia się z nimi) - jeśli chcesz mieć wewnętrzny adres IP (ten, którego używa twój komputer do połączeń, który może być inny) zobacz to odpowiedzieć .

TL; DR - najszybsze metody w 2015 r

Najszybsza metoda wykorzystująca DNS:

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

lub używając externalip :

externalip dns

Najszybszy przy użyciu HTTP:

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

lub używając externalip:

externalip http

Najszybszy przy użyciu HTTPS z ważnym certyfikatem:

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

lub używając externalip:

externalip https

Korzystanie z telnet:

Z ncpoleceniem:

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

lub używając externalip:

externalip telnet

Z telnetpoleceniem:

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

Za pomocą FTP:

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

lub używając externalip:

externalip ftp

Wszystkie powyższe można uruchomić za pomocą mojego skryptu externalip jako:

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

Teraz długa historia ...

Istnieje wiele opcji różnych serwerów zapewniających zewnętrzny adres IP, zwłaszcza za pośrednictwem HTTP zamieszczonego tutaj lub w innym miejscu.

Zrobiłem punkt odniesienia, aby sprawdzić, czy któryś z nich jest lepszy od innych i byłem zaskoczony wynikami. Np. Jeden z najszerzej polecanych ifconfig.me był dla mnie prawie zawsze najwolniejszy, czasami odpowiadając na wiele sekund. Wiele nie działa przez HTTPS lub działa, ale ma nieprawidłowe certyfikaty. Niektóre mają bardzo niespójne czasy reakcji.

Benchmarki

HTTP i HTTPS

To jest źródło mojego skryptu zewnętrznego testu porównawczego ip, którego użyłem:

Możesz uruchomić go samodzielnie, aby sprawdzić, które usługi wymienione tutaj są warte skorzystania:

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

Moje wyniki, które otrzymałem 03.04.2015 z Warszawy - adresy zostały zmienione, aby chronić niewinnych:

Najlepsze czasy odpowiedzi 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'

Najlepsze czasy odpowiedzi 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=''

(Uwaga: istnieją szybkie odpowiedzi z pustą treścią - są one nieprawidłowe).

Najlepsze średnie czasy pingowania:

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/

Oto wyniki, które otrzymałem 03.04.2015 z Amsterdamu:

Najlepsze czasy odpowiedzi 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'

Najlepsze czasy odpowiedzi 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=''

Najlepsze średnie czasy pingowania:

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/

(Pingi 999999 oznaczają 100% utraty pakietów.)

DNS

Dla porównania tutaj są czasy, które przyjmują inne metody - przetestowane 16.06.2015 z Warszawy i Amsterdamu.

Za pomocą:

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

zwykle zajmuje (prawdziwy zegar ścienny) około:

  • 0,035s z Warszawy
  • 0,015s z Amsterdamu

W rzeczywistości istnieją cztery resolwery, których można użyć w ten sposób:

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

Wszystkie dają takie same czasy reakcji w Warszawie i Amsterdamie, ale może się tak nie zdarzyć w innych lokalizacjach.

Używając 208.67.222.222 - adres IP resolver1.opendns.com zamiast nazwy domeny jest szybszy:

  • 0,023s z Warszawy
  • 0,009s z Amsterdamu

ale może nie działać w przyszłości, jeśli adres IP kiedykolwiek się zmieni (chociaż może to być mało prawdopodobne w przypadku dobrze znanego programu rozpoznawania nazw DNS - być może powinienem użyć adresu IP w skrypcie externalip - proszę o komentarz).

Telnet

Telnet z poleceniem nclub telnet(patrz wyżej) zwykle przyjmuje:

  • 0,103 z Warszawy
  • 0,035s z Amsterdamu

(Nie ma zauważalnej różnicy między poleceniami nca telnet).

FTP

  • 0,104 z Warszawy
  • 0,036s z Amsterdamu

Nazwy domen

Wszystkie metody będą szybsze (zwłaszcza przy pierwszym uruchomieniu), gdy zamiast nazw domenowych usług zostaną użyte adresy IP (z wyjątkiem HTTP, który może korzystać z serwerów wirtualnych opartych na hoście i nie będzie działał z czystym adresem IP - nie testowane), ale przestanie działać, gdy usługi zmienią adres IP, więc może być szybsze, ale mniej przyszłościowe.

Komentarze

Jeśli zobaczysz kilka interesujących wyników z Twojej lokalizacji lub uważasz, że zamiast tych, które wybrałem, polecam innych hostów, napisz komentarz. Jeśli brakuje jakiejkolwiek ważnej usługi, prosimy o komentarz lub opublikowanie problemu w serwisie GitHub. Chciałbym na bieżąco aktualizować ten post, korzystając z aktualnego wyboru najskuteczniejszych usług.


2
Czy porównałeśmyip.opendns.com metodę DNS z odpowiedzią Krinkle ? Obecnie wydaje się, że domyślnie wygrywa, ponieważ nie jest świadomy innych dostawców tej metody, ale nadal przydatne byłoby porównanie z innymi metodami.
James Haigh,

@JamesHaigh Dzięki za sugestię. Do odpowiedzi dodałem DNS i inne metody (telnet, ftp). Najszybszą metodą wydaje się być DNS przy użyciu bezpośrednio adresu IP (zamiast nazwy domeny) resolvera.
rsp

Powinieneś także dodać / przetestować canhazip.com / canhazip.com (HTTP i HTTPS).
xxdesmus,

Możesz dodać myip.addr.space do swojej listy. Zbudowałem to sam, ponieważ nie byłem szczególnie zadowolony z żadnego z innych, które wtedy widziałem.
Michael Hampton,

Czasami dig +short myip.opendns.com @resolver1.opendns.comuzyskuję różne wyniki przy użyciu (36.86.63.180), dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short(118.98.115.34) i curl http://canhazip.com(36.71.64.71). Jak zdecydować, który z nich jest poprawny?
Sutandiono

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

Witryna zastąpiona działającą holenderską.


3
+1 Wiedziałem o whatismyip.com, ale nie whatismyip.org, to niesamowite.
Julian

Nigdy o tym nie wiedziałem! Świetna strona!
bbosak

2
@MaciekSawicki Czy -sw tym przypadku opcja jest naprawdę konieczna? Próbowałem z / bez tego w mojej fedorze 15 - bash 4.2.10 (1) i działało to na dwa sposoby.
ztank1013,

4
Wygląda na to, że nie działa już za pośrednictwem interfejsu CLI, ale działa przejście do strony z przeglądarki internetowej. Używam openSUSE 12.1 x64.
SaultDon

5
whatismyip.comusunął bezpłatną usługę sprawdzania zewnętrznego adresu IP. Obawiam się, że to już nie jest poprawne. icanhazip.comnadal działa.
daSong,


18

Możesz użyć ifconfig.me jako alternatywy dla whatismyip.org.

curl -s http://ifconfig.me

Również ifconfig.me ma dodatkowe funkcje. Aby dowiedzieć się, jakie jeszcze informacje możesz otrzymać, odwiedź witrynę.


5
To jest bardzo wolne . Często otrzymuję czasy reakcji powyżej 30 sekund, a czasem nawet ponad minutę! Czasami jest to pół sekundy (co wciąż jest dużo), a następnie około 15 sekund. Jest to testowane z różnych lokalizacji. Zobacz moją odpowiedź, aby uzyskać więcej informacji i testów porównawczych.
rsp

15
wget -O - -q http://whatismyip.org/

3
Nie udało mi się uzyskać mojego adresu IP w ten sposób, po prostu podaje go jako:<img src='ipimg.php'/>
Yuugian

Pracowałem z przyzwoitą ilością magii regularnej, ale nie było to łatwe. Jeśli nalegasz na skorzystanie z tej usługi, pamiętaj o zawinięciu tej linii w skrypt:$ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
składniaerror

13

Amazon AWS

curl https://checkip.amazonaws.com

Przykładowe dane wyjściowe:

123.123.123.123

Lubię to ponieważ:

  • zwraca tylko zwykły tekst IP, nic więcej
  • pochodzi od znanego dostawcy, który prawdopodobnie wkrótce nie przejdzie w tryb offline

9

Wolę korzystać z curlmyip.com Jest to tak proste, jak:

curl curlmyip.com

Jest krótki i prosty do zapamiętania.


W przypadku użycia w bashzamiarze PO nie można obejść się bez -sopcji wymienionej w innych odpowiedziach.
Serge Stroobandt,

3
@SergeStroobandt Tak, możesz. Wszystko, co -srobi, to uruchomić go w trybie cichym, tj. komunikaty o błędach nie będą wyświetlane. Wszystko sprowadza się do tego, jak chce, aby jego skrypt obsługiwał błędy. Samo polecenie zwróci adres IP tak niezawodnie, jak przy użyciu -s.
Garrett Fogerlie

1
Jak dotąd ta strona była najbardziej niezawodna w wielu testach.
Amos Shapira,

9
curl ident.me

LUB

curl ifconfig.me

LUB

curl tnx.nl/ip

LUB

curl ipecho.net/plain

LUB

curl ip.appspot.com

LUB

curl whatismyip.akamai.com

LUB

curl icanhazip.com

LUB

curl wgetip.com

LUB

curl ip.tyk.nu

LUB

curl curlmyip.com

LUB

curl corz.org/ip

LUB

curl bot.whatismyipaddress.com

Odniesienie


6
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1

Puste wyjście tutaj, chociaż strona działa. Masz pomysł, dlaczego? Jestem za proxy, jeśli to istotne, ale wget icanhazip.comdziała.
l0b0

@ l0b0 Spróbuj pominąć | tail -n1część i zobacz, co otrzymujesz z serwera proxy
Eugene Yarmash

Nic, po prostu wyjdź z kodu 1. To samo dotyczy netcat icanhazip.com 80. Wygląda na to, że ignoruje $http_proxyi przyjaciół, ponieważ podanie proxy i portu -xwłaśnie spowodowało zawieszenie procesu.
l0b0

@ l0b0: netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1dla podstawowego proxy HTTP (zakładając, że działa na porcie 3128). Oczywiście dostaniesz z powrotem adres IP serwera proxy.
tripleee

1
HTTP 1.0 nie ma Host:nagłówka żądania - wirtualny hosting oparty na nazwie był jednym z głównych ulepszeń HTTP 1.1. Zmień żądanie, aby określić HTTP / 1.1, lub usuń nagłówek hosta (zalecam ten pierwszy).
CVn

4

Jeśli po przeczytaniu wszystkich tych sugestii chcesz przeczytać jeszcze więcej, oto zapewne przerobiony skrypt Bash.

Zawiera listę serwerów DNS i HTTP, które wydają się działać dobrze od lutego 2017 r.

Jeśli tak dig, najpierw próbuje DNS, który jest prawie o rząd wielkości szybszy niż różne usługi HTTP.

Kończy się przy pierwszej otrzymanej odpowiedzi.

Jeśli nie masz diglub wszystkie serwery DNS uległy awarii, następnie próbuje usług HTTP, dopóki nie otrzyma odpowiedzi.

Serwery są wymienione alfabetycznie, ale przed użyciem są tasowane, aby uniknąć korzystania z tego samego serwera.

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

Przykładowe użycie (nazwałem skrypt 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'

Skomentuj verbosezmienną u góry skryptu, aby uniknąć drukowania na używanym serwerze.

Aktualizacja: ten skrypt jest teraz również w Github, gdzie mogę go zaktualizować w razie potrzeby:
https://github.com/mivk/myip


3

Jeśli chcesz użyć HTTPS, aby uniknąć potencjalnych problemów:

_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"

2
Być może mógłbyś wyjaśnić, jakie są potencjalne pułapki, których unikasz tutaj?
Caleb

Domena ipcheckit.com najwyraźniej jest na sprzedaż i nie obsługuje już usługi wyświetlania adresu IP.
manatwork

ah, pułapki skryptów tylko do pisania :)
Ярослав Рахматуллин

@Chris Down technika jest nadal aktualna, potrzebujesz tylko innej strony obsługującej protokół SSL, aby z niej korzystać.
Caleb,

3

Oto kolejna alternatywa, która zależy od hostów, których firma rozwiązuje problem zarządzania dynamicznym adresem IP, a nie od witryn „usług publicznych”, które mogą zniknąć lub zmienić format.

  1. Zarejestruj swój serwer w jednej z wielu bezpłatnych dynamicznych usług DNS (np. No-ip.com). Otrzymasz wpis DNS, taki jak xxx.no-ip.org.
  2. Zainstaluj narzędzie do dynamicznej aktualizacji usługi (zgłasza zmiany adresu IP usługi).

Aby uzyskać adres IP w skrypcie, po prostu wykonaj:

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

Idealny do użycia w zadaniu cron, aby sprawdzić, czy zmienił się dynamiczny adres IP i niektóre wpisy konfiguracji wymagają zmiany.


3

To zawsze działa dla mnie, używam go w moim conky, aby uzyskać mój adres IP.

wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'

+1 Chociaż wyglądam tak niezdarnie, to podejście również dla mnie kilka razy uratowało życie. Ponieważ Internet nie jest WWW . Możesz mieć dostęp do Internetu, ale możesz (zwykle w serwerowniach) skazany na konsolę bez interfejsu GUI, w takim przypadku ważne jest, aby zapamiętać na pamięć jeden z adresów URL usługi checkIP. A ponieważ ten jest dość powszechny, jest tylko pozornie skompilowany, ponieważ łatwiej będzie zapamiętać DynDNS niż ten amazonaws. To znaczy, jeśli nie masz na to sposobu google. (nawet nie lynx).
składniaerror

3

Ponieważ nie polegam na połączeniu ani na usłudze, używam następującego kodu, który próbuje uzyskać adres IP za pomocą różnych usług (możesz dodać więcej):

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

Aby dodać większą niezawodność (np. Jeśli jedna z usług zmieni swój format), możesz sprawdzić, czy $IPjest to poprawny adres IP, używając następującej funkcji :

# 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;
}

3

ifcfg.me obsługuje:

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

IPv4 i IPv6, jeszcze więcej rzeczy z curl: ifcfg.me/?


Jak ta nslookupmetoda odnosi się do digmetody zawartej w odpowiedzi Krinkle'a ? Oboje używają DNS, prawda? Czy mogę przekazać jakąś opcję, digaby pobierał ten sam rekord DNS, który nslookuptutaj robi?
James Haigh

Tak, możesz użyć, dig +short . @ifcfg.mejeśli chcesz
Eun

2

Prowadzę usługę w chmurze dla mojej rodziny i ten szybki skrypt uruchamiam croncodziennie o 5, ponieważ jestem tani i nie kupię statycznego adresu IP.

Pobiera publiczny adres IP i wysyła go pocztą e-mail do moich użytkowników. Wysłałem wiadomość e-mail w formacie hiperłącza, aby moja mama nie musiała wpisywać portów ani niczego. Może ktoś inny może to wykorzystać.

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

1

Spowoduje to wyświetlenie bieżącego adresu IP w wyskakującym oknie:

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

1

Mam skonfigurowaną usługę, która zwraca adres IP jako JSON / XML lub zwykły tekst. Znajdziesz je tutaj

http://ipof.in/txt

Ten sam adres URL z / json i / xml daje również inne formaty

Jeśli chcesz HTTPS, możesz użyć tych samych adresów URL z prefiksem https. Zaletą jest to, że nawet jeśli korzystasz z Wi-Fi, dostaniesz adres publiczny.

Tak prosty alias myip = "curl https://ipof.in/txt " otrzyma twoje IP


1

Alternatywnie możesz użyć STUN, który został wymyślony, aby odpowiedzieć na to pytanie w sposób zautomatyzowany i jest szeroko stosowany w komunikacji internetowej, np. Przez SIP i WebRTC .

Używając stunclient (na debian / ubuntu do apt-get install stuntman-client) po prostu wykonaj:

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

gdzie A.B.C.Djest adres IP twojego komputera w sieci lokalnej i W.X.Y.Zserwery adresów IP, takie jak strony internetowe, widzą z zewnątrz (i ten, którego szukasz). Za pomocą tej opcji sedmożesz zmniejszyć powyższy wynik tylko do adresu IP:

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

Aby uzyskać alternatywne wyszukiwanie STUN przy użyciu wyłącznie podstawowych narzędzi wiersza poleceń, zobacz moją odpowiedź na AskUbuntu (przeznaczoną jako zabawne ćwiczenie, a nie do użytku produkcyjnego).


0

Przeglądarka tekstowa w3m doskonale nadaje się do bash. Możesz użyć grepi, tailaby skrócić odpowiedź w następujący sposób:

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


0

Korzystanie z żądania DNS nawet za routerem NAT tłumaczącym adresy DNS może działać:

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

lub możesz zamiast tego użyć metody żądania HTTP:

$ curl -s ipinfo.io/ip
x.y.z.t

1
Dlaczego poleciłbyś jeden nad drugim?
roaima,

@roaima Masz rację, decyzja należy do każdego użytkownika.
SebMa,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.