Trovare l'indirizzo IP pubblico in uno script di shell


39

Posso trovare il mio indirizzo IP usando ifconfig o il comando hostname -i.

Ma come posso trovare il mio IP pubblico?

(Ho un IP pubblico statico ma voglio scoprirlo usando il comando unix)


stai cercando di farlo in modo programmatico?
Andrew Keith,

si nella shell script
shantanuo,

1
Stai usando Linux, MacOSX, FreeBSD, ecc? L'output di 'ifconfig' è diverso per questi diversi sistemi operativi e il comando 'ip' non esiste su MacOSX. Stai cercando l'IP del tuo computer (avrai bisogno di uno script di shell per analizzare ifconfig o qualcosa del genere) o del tuo router (I siti Web di seguito potrebbero funzionare)?
Stefan Lasiewski,

Risposte:


49

curl ifconfig.me

curl ifconfig.me/ip (solo per l'IP)

curl ifconfig.me/all (per maggiori informazioni, richiede tempo)

Per ulteriori comandi, visitare: http://ifconfig.me/#cli_wrap


1
Che dire degli indirizzi IPv6?
Matt3o12

Quel collegamento è morto. È possibile utilizzare questo invece:curl http://checkip.amazonaws.com/
Farhan.K

@ Farhan.K si prega di pubblicare questo come una risposta poiché è probabilmente la migliore risposta. In caso contrario, lo farò e menzionerò il tuo nome suggerendolo
Aliostad,

@Aliostad sentiti libero di pubblicarlo :)
Farhan.K,

@ Farhan.K argh, protetto: /
Aliostad

26

È possibile richiedere myip.opendns.com. da OpenDNS. dig @208.67.222.220 myip.opendns.com


8
È semplicemente fantastico. Per qualsiasi versione più facile da ricordare, è possibile inserire dig @resolver1.opendns.com myip.opendns.com. O su Windows: nslookup myip.opendns.com resolver1.opendns.com.
Michael Kropat,

2
Cosa ha funzionato meglio per me: dig @208.67.222.220 myip.opendns.com +shortper ottenere direttamente l'ip senza dover passare attraverso l'intera risposta.
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


Si noti che quanto sopra funziona solo per IPv4 al momento (nessuno di questi resolver sembra avere IPv6 attualmente, ma se si omette -4ed esplicito -t a, si rischia che si guastasse in futuro (ad eccezione di Google txt, che potrebbe effettivamente funzionare per IPv6 un giorno, se abilitato correttamente da Google)).

Nota che myip.opendns.comè risolvibile solo attraverso resolver1.opendns.com, e non con auth1.opendns.com- quindi, sembrano fare del dirottamento DNS e man-in-the-middle del proprio nome di dominio! Pertanto, non è possibile utilizzarlo per trovare l'IP di un risolutore casuale, poiché resolver1.opendns.comnon è autorevole per myip.opendns.com.

Si noti che o-o.myaddr.l.google.comsembra l'approccio più flessibile e a prova di futuro; è anche utile per verificare se il risolutore DNS supporta l'estensione sperimentale EDNS0 per la sottorete client (per la quale pochissimi resolver hanno il supporto):

% 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 <Ho trovato OpenDNS: dig +short AAAA myip.opendns.com @2620:0:ccc::2.
bufh,

Oggi il metodo per ottenere record TXT da Google supporta sia IPv4 che IPv6, quindi è necessario specificare -4o -6se è necessaria una versione IP specifica.
Martin,

12

Una risposta molto semplice se si dispone di accesso a Internet è:

curl icanhazip.com

Ricorda, fidarsi delle fonti di terze parti per il tuo IP potrebbe essere problematico, specialmente se ciò che fai con quei dati ha un significato speciale.

Un modo più affidabile è scegliere un server DNS noto e affidabile (idealmente con DNSSEC) e interrogare il nome host della casella con esso, a condizione che il server DNS contenga tali voci;

dig @trustworthysource.com +short `hostname`

8

Ho scritto un servizio web semplice e veloce per questo.

curl ident.me

Puoi chiedere il tuo IPv4:

curl v4.ident.me

O IPv6:

curl v6.ident.me

E l'API è documentata su http://api.ident.me/



5

Se

  1. hai solo un indirizzo IP pubblico e
  2. sei direttamente connesso a Internet (no NAT / proxy / VPN ecc.)

quindi puoi semplicemente analizzare l'output di ifconfig per gli indirizzi IP delle interfacce (la parte "inet addr:") per ottenere l'elenco degli indirizzi IP di tutte le tue interfacce. L'unico indirizzo IP che non rientra nell'intervallo privato (vedi http://it.wikipedia.org/wiki/IP_address#IPv4_private_addresses ) è il tuo indirizzo IP pubblico.

Lo stesso elenco può essere ottenuto anche tramite

ip addr show

che potrebbe essere più facile da analizzare.

Se non si dispone di una connessione Internet diretta (NAT ecc.), Non è possibile trovare l'indirizzo IP pubblico senza un aiuto esterno (poiché il computer non lo conosce). Quindi dovrai farlo come nelle altre risposte.


4

Ho adottato un approccio leggermente diverso usando il protocollo STUN progettato per NAT Traversal. Se usi Ubuntu puoi semplicemente installare il pacchetto "stun" digitando:

sudo apt-get install stun

Il pacchetto installa un server STUN che probabilmente non ti servirà, ma include anche un client di test STUN che ho usato per risolvere questo problema. Ora puoi recuperare il tuo IP pubblico con un comando (non così semplice):

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

Ora, quello che fa è: stun contatta il server STUN pubblico "stunserver.org" e ottiene una risposta con il tuo IP pubblico, il resto del comando è solo per filtrare l'IP dall'output.


stun.l.google.com è più veloce: D
Zibri

3

Un modo è, è possibile effettuare una richiesta alla pagina all'indirizzo

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

restituisce l'indirizzo IP del tuo sistema


Serve testo semplice con un tipo di testo / html ...
bortzmeyer,

non sta visualizzando il tuo IP nel tuo browser?

2
Ma con il tipo sbagliato.
Bortzmeyer,

@bortzmeyer Uh, qual è il "tipo giusto"? text/htmlva bene per quello che restituisce quella pseudo-API - non è certamente XML o JSON. text/plainforse, ma è interamente utilizzabile come text/html.
Ceejayoz,

3
+1 per una pagina che non necessita di grepping. Inoltrewget -q -O - http://wgetip.com/
xofer il

3

Google ora visualizza il tuo indirizzo IP pubblico: http://www.google.com/search?q=ip


Non funziona per me, né in un browser o via ricciolo.
Ladadadada,

È strano. Il mio dice "Il tuo indirizzo IP pubblico è XX.XX.XXX.XX - Ulteriori informazioni" in alto prima del primo serp.
Jake Wilson,

Ha funzionato sulla mia connessione 3G. Ulteriori informazioni qui .
Ladadadada,

Google per qualche strano motivo mostra solo il tuo indirizzo IP in base alla User-Agentstringa fornita alla pagina. Con Firefox, funziona; ma SeaMonkey con la stringa "Firefox" disabilitata (tramite "general.useragent.compatMode.firefox" impostato su false), improvvisamente no. Non ho assolutamente idea del perché Google abiliti esplicitamente cose come questa solo per Firefox invece di qualsiasi Gecko, dal momento che ci sono molti altri browser desktop basati su Gecko che sono ugualmente compatibili, incluso SeaMonkey.
primo

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

3

Okay ... So che questo è MODO dopo il fatto e probabilmente non vale nemmeno la pena pubblicare, ma ecco la mia soluzione di lavoro.

#!/bin/sh

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

Bello e semplice.


2
Ciò restituisce l'indirizzo IP interno che non è stato richiesto. Ma, per tua informazione, puoi anche farlo con il comando hostname -I(maiuscolo 'i').
Redsandro,

3

Il modo più semplice è usare http://ifconfig.me/ , come suggerito.

In questa pagina, saprai quale comando utilizzare per quali informazioni desideri recuperare.

Per IP:

arricciare ifconfig.me
o
arricciare ifconfig.me/ip

Per nome host pubblico:

arricciare ifconfig.me/host

Per tutte le informazioni in un file XML:

arricciare ifconfig.me/all.xml

ecc ... basta dare un'occhiata a http://ifconfig.me


2

Lo sto facendo molto e da molti dispositivi, quindi ho creato i miei due servizi su un server:

  1. file php alla radice di un server web:

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

    Utilizzo su una shell:

    $ curl -4 mydomain.com
    79.22.192.12
    

    lavorando anche con ipv6:

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

    Con netcat:

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

    Su un router Cisco:

    router#more http://myserver.com/index.php
    79.22.192.12
    
  2. hack rapido con un server telnet personalizzato: xinetd spawning / 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
    }
    

    e poi telnet ad esso:

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

    funziona allo stesso modo con un router:

    router#telnet myserver.com
    79.22.192.12
    

In questo modo puoi farlo funzionare sulla tua rete interna, se qualche comunicazione nat o proxy è coinvolta nella comunicazione e ti piacerebbe sapere da quale IP appari.

Non richiede alcun servizio di terze parti.


2

Per evitare di fare affidamento su fonti esterne, uso prevede, telnet nel mio router e ottenere l'indirizzo IP della sua interfaccia pubblica. Ecco un esempio prevede script:

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

Quindi eseguo lo script sopra in questo modo per ottenere l'ip pubblico:

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

Naturalmente, questo si basa sul presupposto che io abbia accesso come amministratore al router, ed è un router basato su Linux, con il comando ifconfig disponibile.




1

Se quello che vuoi è trovare l'indirizzo IP esterno sul tuo router, chiedi al router stesso il suo indirizzo debole, o chiedi a qualcuno esterno di ottenerlo per te.

per un modo manuale è possibile navigare tra i siti sopra indicati che restituiranno l'ip della richiesta in entrata.

Per un modo automatizzato, puoi provare:

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

che ti porterà alla riga che contiene l'indirizzo IP sulla risposta http, quindi analizzalo con sed, awk, ecc


0

puoi usare solo la shell per controllare il tuo ip esterno, anche usando provider esterni

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

produzione


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

0

Lo faccio. Mi dà solo l'IP senza alcun coinvolgimento di terze parti.

mostra indirizzo IP | grep eth0 | grep inet | tr -s "" | cut -f3 -d "" | cut -f1 -d "/"


3
Vuole il suo indirizzo IP pubblico. Non il locale.
Jake Wilson,

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

0

Ecco un'altra alternativa che dipende dagli host la cui attività aziendale risolve la gestione dell'IP dinamico piuttosto che i siti di "servizio pubblico" che potrebbero andare via o cambiare formato.

1) Registra il tuo server su uno dei tanti servizi DNS dinamici gratuiti (es. No-ip.com). Questo ti darà una voce DNS come xxx.no-ip.org.

2) Installa lo strumento di aggiornamento dinamico del servizio (riporta le modifiche IP al servizio).

Per ottenere l'indirizzo IP in uno script, basta fare:

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

Ottimo per l'uso in cron job per verificare se l'IP dinamico è stato modificato e alcune voci di configurazione devono essere modificate.


0

Su OS X ecco due semplici soluzioni per ottenere sia l'IP privato che quello pubblico (con codice bonus se usi LaunchBar).

IP privato

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

LaunchBar Script

#!/bin/sh

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

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

IP pubblico

$ 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

LaunchBar Script

#!/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"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.