Localizando o endereço IP público em um script de shell

39

Eu posso encontrar meu endereço IP usando o comando ifconfig ou hostname -i.

Mas como encontro meu IP público?

(Eu tenho um IP público estático, mas quero descobrir usando o comando unix)

shantanuo
fonte
você está tentando fazer isso programaticamente?
9139 Andrew Keith
sim em shell script
shantanuo
11
Você está usando Linux, MacOSX, FreeBSD, etc? A saída de 'ifconfig' é diferente para esses diferentes sistemas operacionais e o comando 'ip' não existe no MacOSX. Você está procurando o IP do seu computador (será necessário um script de shell para analisar o ifconfig, ou algo assim) ou o seu roteador (os sites abaixo podem funcionar)?
Stefan Lasiewski

Respostas:

49

curl ifconfig.me

curl ifconfig.me/ip (apenas para o ip)

curl ifconfig.me/all (para mais informações, leva tempo)

Para mais comandos, visite: http://ifconfig.me/#cli_wrap

tsanand129
fonte
11
E os endereços IPv6?
precisa saber é o seguinte
Esse link está morto. Você pode usar isso:curl http://checkip.amazonaws.com/
Farhan.K 3/17/17
@ Farhan.K, por favor, poste isso como uma resposta, pois provavelmente é a melhor resposta. Se não o fizer, eu vou e mencionar seu nome sugerindo que
Aliostad
@Aliostad à vontade para postar isso :)
Farhan.K
@ Farhan.K argh, protegido: /
Aliostad
26

Você pode solicitar myip.opendns.com. do OpenDNS. dig @208.67.222.220 myip.opendns.com

Zoredache
fonte
8
Isso é legal. Para qualquer versão mais fácil de lembrar, você pode inserir dig @resolver1.opendns.com myip.opendns.com. Ou no Windows: nslookup myip.opendns.com resolver1.opendns.com.
Michael Kropat
2
O que funcionou melhor para mim: dig @208.67.222.220 myip.opendns.com +shortpara obter diretamente o ip sem ter que passar por toda a resposta.
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


Observe que o descrito acima funciona apenas para o IPv4 atualmente (nenhum desses resolvedores parece ter o IPv6 atualmente, mas se você omitir -4e o explícito -t a, corre o risco de quebrar no futuro (com exceção do Google txt, que pode realmente funcionar para IPv6 um dia, se ativado corretamente pelo Google)).

Note que isso myip.opendns.comsó pode ser resolvido resolver1.opendns.com, e não com auth1.opendns.com- então, eles parecem estar realizando algum seqüestro de DNS e o homem do meio de seu próprio nome de domínio! Portanto, você não pode usá-lo para encontrar o IP de um resolvedor aleatório, pois ele resolver1.opendns.comnão é autorizado myip.opendns.com.

Observe que o-o.myaddr.l.google.comparece a abordagem mais flexível e à prova de futuro; é até bom testar se o resolvedor DNS suporta a extensão experimental EDNS0 para sub-rede do cliente (para a qual poucos resolvedores têm suporte):

% 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
cnst
fonte
2
@ Matt3o12 <I encontrados OpenDNS: dig +short AAAA myip.opendns.com @2620:0:ccc::2.
bufh
Atualmente, o método de obtenção de registros TXT do Google suporta IPv4 e IPv6, portanto, você deve especificar -4ou -6se precisa de uma versão IP específica.
Martin
12

Uma resposta muito simples se você tiver acesso à Internet é:

curl icanhazip.com

Lembre-se de que confiar em fontes de terceiros para seu IP pode ser problemático, especialmente se o que você faz com esses dados tiver um significado especial.

Uma maneira mais confiável é escolher um servidor DNS conhecido e confiável (idealmente executando o DNSSEC) e consultar o nome do host da caixa com ele, desde que o servidor DNS contenha essas entradas;

dig @trustworthysource.com +short `hostname`
Matthew Ife
fonte
8

Eu escrevi um serviço web simples e rápido para isso.

curl ident.me

Você pode solicitar seu IPv4:

curl v4.ident.me

Ou IPv6:

curl v6.ident.me

E a API está documentada em http://api.ident.me/

Pierre Carrier
fonte
5

E se

  1. você tem apenas um endereço IP público e
  2. você está conectado diretamente à internet (sem NAT / proxy / VPN, etc.)

então você pode simplesmente analisar a saída do ifconfig para os endereços IP das interfaces (a parte "inet addr:") para obter a lista de endereços IP de todas as suas interfaces. O único endereço IP que não está no intervalo privado (consulte http://en.wikipedia.org/wiki/IP_address#IPv4_private_addresses ) é o seu endereço IP público.

A mesma lista também pode ser obtida através de

ip addr show

o que pode ser mais fácil de analisar.

Se você não possui uma conexão direta à Internet (NAT, etc.), não há como encontrar seu endereço IP público sem ajuda externa (já que o computador não o conhece). Então você terá que fazê-lo como nas outras respostas.

sleske
fonte
4

Adotei uma abordagem um pouco diferente usando o protocolo STUN, projetado para o NAT Traversal. Se você usa o Ubuntu, basta instalar o pacote "stun" digitando:

sudo apt-get install stun

O pacote instala um servidor STUN do qual você provavelmente não precisará, mas também vem com um cliente de teste STUN que eu usei para resolver esse problema. Agora você pode recuperar seu IP público com um comando (não tão simples):

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

Agora, o que ele faz é: stun entra em contato com o servidor público STUN "stunserver.org" e recebe uma resposta com seu IP público, o restante do comando é apenas para filtrar o IP da saída.


fonte
stun.l.google.com é mais rápido: D
Zibri
3

Uma maneira é fazer uma solicitação para a página em

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

retorna o endereço IP do seu sistema

Biranchi
fonte
Ele serve de texto simples com um tipo de texto / html ...
Bortzmeyer
não está exibindo seu IP no seu navegador?
2
Mas com o tipo errado.
Bortzmeyer
@bortzmeyer Uh, qual é o "tipo certo"? text/htmlé bom para o que a pseudo-API retorna - certamente não é XML ou JSON. text/plaintalvez, mas é totalmente utilizável como text/html.
ceejayoz
3
+1 para uma página que não precisa de grepping. Tambémwget -q -O - http://wgetip.com/
xofer 10/11/11
3

O Google agora exibe seu endereço IP público: http://www.google.com/search?q=ip

Jake Wilson
fonte
Isso não está funcionando para mim, seja em um navegador ou via curl.
21411 Ladadadada
Isso é estranho. O meu diz "Seu endereço IP público é XX.XX.XXX.XX - Saiba mais" na parte superior antes da primeira serp.
9306 Jake Wilson
Trabalhei na minha conexão 3G. Saiba mais pontos aqui .
21411 Ladadadada
O Google, por algum motivo estranho, mostra apenas seu endereço IP com base em qual User-Agentsequência é fornecida à página. Com o Firefox, ele funciona; mas o SeaMonkey com a string "Firefox" desativada (por meio de "general.useragent.compatMode.firefox" definido como false), de repente não acontece. Não tenho absolutamente nenhuma idéia de por que o Google permite explicitamente coisas como essa apenas para o Firefox, em vez de apenas qualquer Gecko, já que existem muitos outros navegadores de desktop baseados no Gecko que são igualmente compatíveis, incluindo o SeaMonkey.
CNST
curl -qs " google.com/search?q=blowme"|tr " () "" \ n "| grep Client | cut -d": "-f 2 | tr -d" "
Zibri em
3

Ok ... Eu sei que isso é MUITO MANUAL após o fato e provavelmente nem vale a pena postar, mas aqui está a minha solução de trabalho.

#!/bin/sh

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

Agradável e simples.

Skittles
fonte
2
Isso retorna o endereço IP interno que não foi solicitado. Mas, para sua informação, você também pode fazer isso com o comando hostname -I(capital 'i').
Redsandro 18/03/2013
3

A maneira mais simples é usar http://ifconfig.me/ , conforme sugerido.

Nesta página, você saberá qual comando usar para quais informações deseja recuperar.

Para IP:

enrolar ifconfig.me
ou
enrolar ifconfig.me/ip

Para nome de host público:

enrolar ifconfig.me/host

Para todas as informações em um arquivo XML:

enrolar ifconfig.me/all.xml

etc ... basta verificar http://ifconfig.me

Kelindil
fonte
2

Estou fazendo muito isso e em vários dispositivos, então fiz meus próprios dois serviços em um servidor:

  1. arquivo php na raiz de um servidor web:

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

    Uso em uma concha:

    $ curl -4 mydomain.com
    79.22.192.12
    

    também trabalhando com ipv6:

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

    Com o netcat:

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

    Em um roteador Cisco:

    router#more http://myserver.com/index.php
    79.22.192.12
    
  2. hack rápido com um servidor de telnet personalizado: 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 depois telnet para ele:

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

    funciona da mesma forma com um roteador:

    router#telnet myserver.com
    79.22.192.12
    

Dessa forma, você pode fazer com que ele funcione na sua rede interna, se algum nat ou proxy estiver envolvido na comunicação e você quiser saber a partir de qual IP você aparece.

Não requer nenhum serviço de terceiros.

petrus
fonte
2

Para evitar depender de fontes externas, uso o expect, para telnetar no meu roteador e obter o endereço IP de sua interface pública. Aqui está um exemplo de script esperado:

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

Em seguida, executo o script acima dessa maneira para obter o ip público:

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

Obviamente, isso se baseia na suposição de que eu tenho acesso de administrador ao roteador e é um roteador baseado em linux, com o comando ifconfig disponível.

Hammad Akhwand
fonte
1

Se o que você deseja é encontrar o endereço IP externo no seu roteador, solicite ao próprio roteador o endereço de wan ou peça a alguém de fora para buscá-lo.

de maneira manual, você pode navegar em qualquer um dos sites acima mencionados que retornarão o ip da solicitação recebida.

De uma maneira automatizada, você pode tentar:

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

que lhe dará a linha que contém o endereço IP na resposta http e, em seguida, analisa-o com sed, awk, etc.

quanta
fonte
0

você pode usar apenas o shell para verificar seu ip externo, também usando provedores externos

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

saída


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

fonte
0

Eu faço isso. Apenas me fornece o IP sem nenhum envolvimento de terceiros.

show de endereço IP | grep eth0 | grep inet | tr-s "" | corte -f3 -d "" | corte -f1 -d "/"

Leigh Geary
fonte
3
Ele quer o seu endereço IP público. Não é o local.
Jake Wilson
0
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
Fathi
fonte
0

Aqui está outra alternativa que depende dos hosts cuja empresa resolve gerenciar o IP dinâmico em vez dos sites de "serviço público" que podem desaparecer ou alterar o formato.

1) Registre seu servidor em um dos muitos serviços dinâmicos de DNS gratuitos (por exemplo, no-ip.com) Isso fornecerá uma entrada DNS como xxx.no-ip.org.

2) Instale a ferramenta de atualização dinâmica do serviço (relata alterações de IP no serviço).

Para obter o endereço IP em um script, basta:

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

Ótimo para uso no trabalho do cron para verificar se o IP dinâmico foi alterado e algumas entradas de configuração precisam ser alteradas.

cgmonroe
fonte
0

No OS X, aqui estão duas soluções simples para obter o IP público e o privado (com código de bônus se você usar o LaunchBar).

IP privado

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

Script LaunchBar

#!/bin/sh

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

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

IP público

$ 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

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

fonte