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-tree
zainstalowany. Jakie inne sposoby mogę uzyskać moje zewnętrzne IP?
linux
shell-script
ip
Eugene Yarmash
źródło
źródło
Odpowiedzi:
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.).
Korzystanie
dig
z OpenDNS jako resolvera:Być może jest to alias w twoim,
bashrc
więc łatwo je zapamiętaćOdpowiada zwykłym adresem IP:
Składnia
(Skrót od https://ss64.com/bash/dig.html ) :
Typ
ANY
zapytania zwraca rekord AAAA lub A. Aby preferować połączenie IPv4 lub IPv6, użyj odpowiednio opcji-4
lub-6
.Aby wymagać odpowiedzi, należy podać adres IPv4, zamień DOWOLNY na
A
; w przypadku IPv6 zamień go na.AAAA
Uwaga: 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:
Przykładowy alias, który konkretnie żąda adresu IPv4:
A dla IPv6:
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
+short
opcji ujawnienia szczegółów zapytania DNS. Na przykład:źródło
myip.opendns.com
publicznego DNS w Google?curl http://canhazip.com
. Zobacz askubuntu.com/a/427092/2273UWAGA: 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:
lub używając externalip :
Najszybszy przy użyciu HTTP:
lub używając externalip:
Najszybszy przy użyciu HTTPS z ważnym certyfikatem:
lub używając externalip:
Korzystanie z telnet:
Z
nc
poleceniem:lub używając externalip:
Z
telnet
poleceniem:Za pomocą FTP:
lub używając externalip:
Wszystkie powyższe można uruchomić za pomocą mojego skryptu externalip jako:
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:
Moje wyniki, które otrzymałem 03.04.2015 z Warszawy - adresy zostały zmienione, aby chronić niewinnych:
Najlepsze czasy odpowiedzi http:
Najlepsze czasy odpowiedzi https:
(Uwaga: istnieją szybkie odpowiedzi z pustą treścią - są one nieprawidłowe).
Najlepsze średnie czasy pingowania:
Oto wyniki, które otrzymałem 03.04.2015 z Amsterdamu:
Najlepsze czasy odpowiedzi http:
Najlepsze czasy odpowiedzi https:
Najlepsze średnie czasy pingowania:
(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ą:
zwykle zajmuje (prawdziwy zegar ścienny) około:
W rzeczywistości istnieją cztery resolwery, których można użyć w ten sposób:
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:
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
nc
lubtelnet
(patrz wyżej) zwykle przyjmuje:(Nie ma zauważalnej różnicy między poleceniami
nc
atelnet
).FTP
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.
źródło
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.dig +short myip.opendns.com @resolver1.opendns.com
uzyskuję 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) icurl http://canhazip.com
(36.71.64.71). Jak zdecydować, który z nich jest poprawny?Witryna zastąpiona działającą holenderską.
źródło
-s
w 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.whatismyip.com
usunął bezpłatną usługę sprawdzania zewnętrznego adresu IP. Obawiam się, że to już nie jest poprawne.icanhazip.com
nadal działa.Ponieważ wspomniano już whatsmyip.org i ifconfig.me :
źródło
curl
rozwiązania (choć prawidłowe) nadal zależą od zewnętrznej biblioteki (libcurl
).Możesz użyć ifconfig.me jako alternatywy dla whatismyip.org.
Również ifconfig.me ma dodatkowe funkcje. Aby dowiedzieć się, jakie jeszcze informacje możesz otrzymać, odwiedź witrynę.
źródło
źródło
<img src='ipimg.php'/>
$ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
Amazon AWS
Przykładowe dane wyjściowe:
Lubię to ponieważ:
źródło
Wolę korzystać z curlmyip.com Jest to tak proste, jak:
curl curlmyip.com
Jest krótki i prosty do zapamiętania.
źródło
bash
zamiarze PO nie można obejść się bez-s
opcji wymienionej w innych odpowiedziach.-s
robi, 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
.LUB
LUB
LUB
LUB
LUB
LUB
LUB
LUB
LUB
LUB
LUB
Odniesienie
źródło
źródło
wget icanhazip.com
działa.| tail -n1
część i zobacz, co otrzymujesz z serwera proxynetcat icanhazip.com 80
. Wygląda na to, że ignoruje$http_proxy
i przyjaciół, ponieważ podanie proxy i portu-x
właśnie spowodowało zawieszenie procesu.netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1
dla podstawowego proxy HTTP (zakładając, że działa na porcie 3128). Oczywiście dostaniesz z powrotem adres IP serwera proxy.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).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
dig
lub 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.
Przykładowe użycie (nazwałem skrypt
myip
):Skomentuj
verbose
zmienną 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
źródło
Jeśli chcesz użyć HTTPS, aby uniknąć potencjalnych problemów:
źródło
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.
Aby uzyskać adres IP w skrypcie, po prostu wykonaj:
Idealny do użycia w zadaniu cron, aby sprawdzić, czy zmienił się dynamiczny adres IP i niektóre wpisy konfiguracji wymagają zmiany.
źródło
To zawsze działa dla mnie, używam go w moim conky, aby uzyskać mój adres IP.
źródło
amazonaws
. To znaczy, jeśli nie masz na to sposobu google. (nawet nielynx
).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):
Aby dodać większą niezawodność (np. Jeśli jedna z usług zmieni swój format), możesz sprawdzić, czy
$IP
jest to poprawny adres IP, używając następującej funkcji :źródło
ifcfg.me obsługuje:
IPv4 i IPv6, jeszcze więcej rzeczy z curl: ifcfg.me/?
źródło
nslookup
metoda odnosi się dodig
metody zawartej w odpowiedzi Krinkle'a ? Oboje używają DNS, prawda? Czy mogę przekazać jakąś opcję,dig
aby pobierał ten sam rekord DNS, którynslookup
tutaj robi?dig +short . @ifcfg.me
jeśli chceszProwadzę usługę w chmurze dla mojej rodziny i ten szybki skrypt uruchamiam
cron
codziennie 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ć.
źródło
Spowoduje to wyświetlenie bieżącego adresu IP w wyskakującym oknie:
źródło
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
źródło
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:gdzie
A.B.C.D
jest adres IP twojego komputera w sieci lokalnej iW.X.Y.Z
serwery adresów IP, takie jak strony internetowe, widzą z zewnątrz (i ten, którego szukasz). Za pomocą tej opcjised
możesz zmniejszyć powyższy wynik tylko do adresu IP: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).
źródło
Przeglądarka tekstowa w3m doskonale nadaje się do bash. Możesz użyć
grep
i,tail
aby skrócić odpowiedź w następujący sposób:źródło
Użyj curl, aby trafić do usługi ip shtuff.it
źródło
Korzystanie z żądania DNS nawet za routerem NAT tłumaczącym adresy DNS może działać:
lub możesz zamiast tego użyć metody żądania HTTP:
źródło