Znajdowanie publicznego adresu IP w skrypcie powłoki


39

Mogę znaleźć mój adres IP za pomocą polecenia ifconfig lub hostname -i.

Ale jak mogę znaleźć moje publiczne IP?

(Mam statyczny publiczny adres IP, ale chcę go znaleźć za pomocą komendy unix)


próbujesz to zrobić programowo?
Andrew Keith,

tak w skrypcie powłoki
shantanuo

1
Czy używasz Linuksa, MacOSX, FreeBSD itp.? Wyjście „ifconfig” jest różne dla tych różnych systemów operacyjnych, a komenda „ip” nie istnieje w MacOSX. Czy szukasz adresu IP swojego komputera (będziesz potrzebować skryptu powłoki, aby przeanalizować ifconfig lub coś takiego), czy routera (poniższe strony mogą działać)?
Stefan Lasiewski

Odpowiedzi:


49

curl ifconfig.me

curl ifconfig.me/ip (tylko dla ip)

curl ifconfig.me/all (więcej informacji wymaga czasu)

Więcej poleceń można znaleźć na stronie: http://ifconfig.me/#cli_wrap


1
Co z adresami IPv6?
Matt3o12,

Ten link jest martwy. Możesz użyć tego zamiast tego:curl http://checkip.amazonaws.com/
Farhan.K

@ Farhan.K prześlij to jako odpowiedź, ponieważ jest to prawdopodobnie najlepsza odpowiedź. Jeśli nie, wspomnę i sugeruję twoje imię
Aliostad

@Aliostad nie krępuje się opublikować :)
Farhan.K

@ Farhan.K argh, chroniony: /
Aliostad

26

Można zażądać myip.opendns.com. z OpenDNS. dig @208.67.222.220 myip.opendns.com


8
To po prostu fajne. Dla każdej łatwiejszej do zapamiętania wersji możesz ją zainstalować dig @resolver1.opendns.com myip.opendns.com. Lub w systemie Windows: nslookup myip.opendns.com resolver1.opendns.com.
Michael Kropat,

2
Co działało dla mnie najlepiej: dig @208.67.222.220 myip.opendns.com +shortaby uzyskać bezpośredni adres IP bez konieczności przejścia całej odpowiedzi.
Christopher Chiche

18

dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short

dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short

dig -4 @resolver1.opendns.com -t a myip.opendns.com +short


Zauważ, że powyższe działa tylko w przypadku IPv4 obecnie (wydaje się, że żaden z tych resolverów nie ma obecnie IPv6, ale jeśli pominiesz -4i jawnie -t a, ryzykujesz jego awarią w przyszłości (z wyjątkiem Google txt, który może faktycznie działać dla IPv6 jeden dzień, jeśli Google odpowiednio go włącza)).

Zauważ, że myip.opendns.comjest to możliwe do rozwiązania tylko poprzez resolver1.opendns.com, a nie za pomocą auth1.opendns.com- wydaje się, że dokonują przejęcia DNS i man-in-the-środkowej części własnej nazwy domeny! Dlatego nie można go użyć do znalezienia adresu IP losowego resolwera, ponieważ resolver1.opendns.comnie jest on wiarygodny myip.opendns.com.

Pamiętaj, że o-o.myaddr.l.google.comwygląda to na najbardziej elastyczne i przyszłościowe podejście; jest nawet dobry do testowania, czy Twój program rozpoznawania nazw DNS obsługuje eksperymentalne rozszerzenie EDNS0 dla podsieci klienta (które obsługuje bardzo niewiele programów tłumaczących):

% dig @8.8.8.8 -t txt o-o.myaddr.l.google.com +noall +answer +stats | tail -8
;; global options:  printcmd
o-o.myaddr.l.google.com. 60     IN      TXT     "74.125.189.16"
o-o.myaddr.l.google.com. 60     IN      TXT     "edns0-client-subnet 88.198.54.0/24"
;; Query time: 13 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Dec  8 20:38:46 2013
;; MSG SIZE  rcvd: 114

2
@ Matt3o12 <znalazłem OpenDNS: dig +short AAAA myip.opendns.com @2620:0:ccc::2.
bufh

Obecnie metoda uzyskiwania rekordów TXT od Google obsługuje zarówno IPv4, jak i IPv6, więc powinieneś określić, -4czy -6potrzebujesz konkretnej wersji IP.
Martin

12

Bardzo prostą odpowiedzią, jeśli masz dostęp do Internetu, jest:

curl icanhazip.com

Pamiętaj, że zaufanie źródłom stron trzecich do twojego adresu IP może być problematyczne, szczególnie jeśli to, co robisz z tymi danymi, ma szczególne znaczenie.

Bardziej godnym zaufania sposobem jest wybranie znanego, godnego zaufania serwera DNS (najlepiej z uruchomionym DNSSEC) i zapytanie go o nazwę hosta skrzynki, pod warunkiem, że twój serwer DNS zawiera takie wpisy;

dig @trustworthysource.com +short `hostname`



5

Jeśli

  1. masz tylko jeden publiczny adres IP i
  2. masz bezpośrednie połączenie z Internetem (brak NAT / proxy / VPN itp.)

następnie możesz po prostu przeanalizować dane wyjściowe z ifconfig dla adresów IP interfejsów (część „inet addr:”), aby uzyskać listę adresów IP wszystkich interfejsów. Jeden adres IP, który nie znajduje się w zakresie prywatnym (patrz http://en.wikipedia.org/wiki/IP_address#IPv4_private_addresses ), to twój publiczny adres IP.

Tę samą listę można również uzyskać poprzez

ip addr show

co może być łatwiejsze do przeanalizowania.

Jeśli nie masz bezpośredniego połączenia z Internetem (NAT itp.), Nie możesz znaleźć swojego publicznego adresu IP bez pomocy zewnętrznej (ponieważ komputer go nie zna). Musisz to zrobić tak jak w innych odpowiedziach.


4

Przyjąłem nieco inne podejście, używając protokołu STUN, który został zaprojektowany dla NAT Traversal. Jeśli używasz Ubuntu, możesz po prostu zainstalować pakiet „stun”, wpisując:

sudo apt-get install stun

Pakiet instaluje serwer STUN, który prawdopodobnie nie będzie ci potrzebny, ale zawiera również klienta testowego STUN, którego użyłem do rozwiązania tego problemu. Teraz możesz odzyskać swój publiczny adres IP za pomocą jednego (nie tak prostego) polecenia:

stun -v stunserver.org 2>&1 1>/dev/null | grep MappedAddress | sed -e 's/.*MappedAddress = //' -e 's/:.*//' | uniq

Teraz działa: ogłuszenie kontaktuje się z publicznym serwerem STUN „stunserver.org” i otrzymuje odpowiedź z publicznym adresem IP, resztą polecenia jest tylko odfiltrowanie adresu IP z wyjścia.


stun.l.google.com jest szybszy: D
Zibri

3

Jednym ze sposobów jest przesłanie żądania do strony pod adresem

http://www.biranchi.com/ip.php

zwraca adres IP twojego systemu


Obsługuje zwykły tekst z rodzajem tekstu / HTML ...
bortzmeyer

czy nie wyświetla twojego adresu IP w przeglądarce?

2
Ale z niewłaściwym typem.
bortzmeyer

@bortzmeyer Uh, jaki jest „właściwy typ”? text/htmljest w porządku dla tego, co zwraca ten pseudo-API - z pewnością nie jest to XML ani JSON. text/plainmoże, ale jest całkowicie użyteczny jako text/html.
ceejayoz,

3
+1 dla strony, która nie wymaga grepowania. Równieżwget -q -O - http://wgetip.com/
Xofer

3

Google wyświetla teraz twój publiczny adres IP: http://www.google.com/search?q=ip


To nie działa dla mnie, ani w przeglądarce, ani przez curl.
Ladadadada

To jest dziwne. Mój mówi „Twój publiczny adres IP to XX.XX.XXX.XX - Dowiedz się więcej” u góry przed pierwszym serp.
Jake Wilson

Pracowałem na moim połączeniu 3G. Dowiedz się więcej punktów tutaj .
Ladadadada

Google z jakiegoś dziwnego powodu pokazuje tylko twój adres IP na podstawie tego, który User-Agentciąg znaków jest dostarczany do strony. W przeglądarce Firefox działa; ale SeaMonkey z wyłączonym ciągiem „Firefox” (poprzez „general.useragent.compatMode.firefox” ustawioną na false), nagle nie robi tego. Nie mam pojęcia, dlaczego Google wyraźnie włącza takie rzeczy tylko w Firefoksie zamiast w dowolnym Gecko, ponieważ istnieje wiele innych przeglądarek stacjonarnych opartych na Gecko, które są równie kompatybilne, w tym SeaMonkey.
cnst

curl -qs " google.com/search?q=blowme"|tr " () "" \ n "| grep Klient | cut -d": "-f 2 | tr -d" "
Zibri

3

Okej ... Wiem, że jest to DROGA po fakcie i prawdopodobnie nawet nie warto pisać, ale oto moje działające rozwiązanie.

#!/bin/sh

IP="$(ifconfig | egrep 'inet ' | sed -e 's/inet //' -e 's/addr://' -e 's/ Bcast.*//' -e 's/127.*//')"
echo $IP

Ładne i proste.


2
Zwraca wewnętrzny adres IP, który nie został zapytany. Ale dla twojej informacji możesz to również zrobić za pomocą polecenia hostname -I(duże „i”).
Redsandro,

3

Najprostszym sposobem jest użycie http://ifconfig.me/ , zgodnie z sugestią.

Na tej stronie dowiesz się, jakiego polecenia użyć, aby uzyskać informacje, które chcesz pobrać.

Dla adresu IP:

zwinąć ifconfig.me
lub
curl ifconfig.me/ip

W przypadku publicznej nazwy hosta:

zwinąć ifconfig.me/host

Wszystkie informacje w pliku XML:

zwiń ifconfig.me/all.xml

itp ... po prostu sprawdź http://ifconfig.me


2

Często to robię i na wielu urządzeniach, więc stworzyłem dwie własne usługi na serwerze:

  1. plik php w katalogu głównym serwera WWW:

    user@host:~$ cat index.php`
    <?php echo $_SERVER['REMOTE_ADDR']; echo "\n" ?>
    

    Użycie na powłoce:

    $ curl -4 mydomain.com
    79.22.192.12
    

    współpracuje również z ipv6:

    $ curl mydomain.com
    2a01:e34:ee7d:180::3
    

    Z netcat:

    $ echo "GET /" | nc myserver.com 80
    2a01:e34:ee7d:180::3
    

    Na routerze Cisco:

    router#more http://myserver.com/index.php
    79.22.192.12
    
  2. szybki hack z niestandardowym serwerem telnet: xinetd spawn / usr / bin / env:

    service telnet
    {
       server           = /usr/bin/env
       socket_type      = stream
       protocol         = tcp
       flags            = IPv6
       wait             = no
       port             = 23
       cps              = 3 30
       passenv          = %a
    }
    

    a następnie telnet do niego:

    $ nc -4 myserver.com 23
    REMOTE_HOST=::ffff:79.22.192.12
    
    $ nc myserver.com 23
    REMOTE_HOST=2a01:e34:ee7d:180::3
    

    działa tak samo z routerem:

    router#telnet myserver.com
    79.22.192.12
    

W ten sposób możesz sprawić, że będzie działał w twojej sieci wewnętrznej, jeśli jakiś nat lub proxy jest zaangażowany w komunikację i chcesz wiedzieć z jakiego adresu IP się pojawiasz.

Nie wymaga usług stron trzecich.


2

Aby uniknąć polegania na źródłach zewnętrznych, używam metody expect do telnet do routera i uzyskania adresu IP jego publicznego interfejsu. Oto przykładowy skrypt:

#!/usr/bin/expect
if { $argc < 3 } {
puts "usage: ./telnet2router.exp router-ip username password"
return -1
}
set ip [lrange $argv 0 0]
set username [lrange $argv 1 1]
set password [lrange $argv 2 2]

spawn telnet $ip
expect "login:" {
    send "$username\r"
}
expect "Password:" {
    send "$password\r"
}
expect "#" {
    send "ifconfig ppp0 | grep inet\r"
    send "exit\r"
}
expect eof

Następnie wykonuję powyższy skrypt w taki sposób, aby uzyskać publiczny adres IP:

./telnet2router.exp <router-ip> <username> <password> | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1

Oczywiście opiera się to na założeniu, że mam dostęp administratora do routera i jego routera z systemem Linux, z dostępną komendą ifconfig.




1

Jeśli chcesz znaleźć zewnętrzny adres IP na routerze, albo zapytaj sam router o jego adres wan, albo poproś kogoś z zewnątrz, aby go dla ciebie znalazł.

ręcznie możesz przeglądać dowolne z powyższych witryn, które zwracają ip przychodzącego żądania.

W sposób zautomatyzowany możesz wypróbować:

wget -q -O - http://www.ipaddressworld.com | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}'\. 

który dostanie ci linię zawierającą adres IP w odpowiedzi http, a następnie przeanalizuje go za pomocą sed, awk itp


0

możesz użyć tylko powłoki, aby sprawdzić swój zewnętrzny adres IP, również korzystając z zewnętrznych dostawców

#!/bin/bash
TCP_HOST="checkmyip.com"
TCP_PORT=80              
exec 5<>/dev/tcp/"${TCP_HOST}"/"${TCP_PORT}"
echo -e "GET / HTTP/1.0\nHOST:${TCP_HOST}\n" >&5
while read -r line 
do  
    case "$line" in
        *"Your local IP address is"* ) 
            line="${line#*Your local IP address is&nbsp;}"
            line=${line%%</p>*}
            echo "Your ip is: $line"
            exec >&5-
            exit
            ;;            
    esac
done <&5

wydajność


0
lynx --dump http://www.whatismyip.com/ | grep -o '[0-9]. * \. [0-9]. * \. [0-9]. * \. [0-9]. *'
-m1 

0

Robię to. Daje mi to tylko adres IP bez udziału stron trzecich.

adres IP pokaż | grep eth0 | grep inet | tr -s "" | cut -f3 -d "" | cut -f1 -d "/"


3
On chce swojego publicznego adresu IP. Nie lokalny.
Jake Wilson,

0
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'

0

Oto kolejna alternatywa, która zależy od hostów, których firma rozwiązuje problem zarządzania dynamicznym adresem IP, a nie od stron „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, np. 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.


0

W systemie OS X dostępne są dwa proste rozwiązania pozwalające uzyskać zarówno prywatny, jak i publiczny adres IP (z kodem bonusowym, jeśli używasz paska LaunchBar).

Prywatne IP

$ ipconfig getifaddr $1
# $1=en0 || en1 || en*

Skrypt LaunchBar

#!/bin/sh

title="$USER@$(HOSTNAME -s)"
text=$(ipconfig getifaddr en1)

open "x-launchbar:large-type?font-name=TerminalDosis-Light&string=$text&title=$title"

Publiczny adres IP

$ dig +time=1 +tries=1 +retry=1 +short myip.opendns.com @resolver1.opendns.com
# ||    
$ curl $1
# $1=http://wtfismyip.com/text || http://ip-addr.es || http://icanhazip.com || http://wgetip.com || http://ident.me || http://ifconfig.me || https://shtuff.it/myip/short || http://curlmyip.com

Skrypt LaunchBar

#!/bin/sh

title="$USER@$(HOSTNAME -s)"
text=$(dig +time=1 +tries=1 +retry=1 +short myip.opendns.com @resolver1.opendns.com)

open "x-launchbar:large-type?font-name=TerminalDosis-Light&string=$text&title=$title"
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.