Encontrando o endereço IP público em um shell script

38

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 encontrá-lo usando o comando unix)

    
por shantanuo 06.10.2009 / 05:16

23 respostas

48

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: link

    
por 01.06.2012 / 04:47
26

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

    
por 10.11.2011 / 01:01
17

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 acima só funciona para o IPv4 atualmente (nenhum desses resolvedores parece ter o IPv6 atualmente, mas se você omitir -4 e o explícito -t a , você corre o risco de quebrar no futuro (com o exceção do txt do Google, que pode realmente funcionar para o IPv6 um dia, se habilitado corretamente pelo Google).

Observe que myip.opendns.com só pode ser resolvido através de resolver1.opendns.com , e não com auth1.opendns.com - portanto, eles parecem estar fazendo alguns sequestros de DNS e man-in-the-middle de seu próprio nome de domínio! Assim, você não pode usá-lo para encontrar o IP de um resolvedor aleatório, pois resolver1.opendns.com não é autoritativo para myip.opendns.com .

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

% 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
    
por 09.12.2013 / 04:46
12

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

curl icanhazip.com

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

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

dig @trustworthysource.com +short 'hostname'
    
por 10.11.2011 / 00:13
8

Eu escrevi um webservice simples e rápido para isso.

curl ident.me

Você pode pedir seu IPv4:

curl v4.ident.me

Ou IPv6:

curl v6.ident.me

E a API está documentada no link

    
por 03.01.2013 / 22:34
7

Uma maneira: link

    
por 06.10.2009 / 05:17
5

Se

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

então você pode simplesmente analisar a saída de 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 link ) é o seu endereço IP público.

A mesma lista também pode ser obtida por meio de

ip addr show

que pode ser mais fácil de analisar.

Se você não tiver uma conexão direta com a Internet (NAT, etc.), não será possível encontrar seu endereço IP público sem ajuda externa (já que seu computador não o conhece). Então você terá que fazer como nas outras respostas.

    
por 07.10.2009 / 00:59
4

Adotei uma abordagem 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 que 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 isso faz é: stun entra em contato com o servidor STUN público "stunserver.org" e recebe uma resposta com seu IP público, o resto do comando é apenas para filtrar o IP da saída.

    
por 05.04.2010 / 22:19
3

Uma maneira é, você pode fazer uma solicitação para a página em

link

retorna o endereço IP do seu sistema

    
por 25.11.2009 / 04:17
3

O Google agora exibe seu endereço IP público: link

    
por 10.11.2011 / 00:00
3

Ok ... Eu sei que isso é bem depois do fato e provavelmente nem vale a pena postar, mas aqui está 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.

    
por 18.11.2011 / 14:52
3

A maneira mais simples é usar o link , conforme sugerido.

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

Para IP:

curl ifconfig.me
ou
curl ifconfig.me/ip

Para nome de host público:

curl ifconfig.me/host

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

curl ifconfig.me/all.xml

etc ... basta verificar o link

    
por 04.01.2013 / 00:02
2

Estou fazendo muito isso e, a partir de muitos dispositivos, criei meus próprios serviços em um servidor:

  1. arquivo php na raiz de um servidor:

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

    Uso em um shell:

    $ curl -4 mydomain.com
    79.22.192.12
    

    também trabalhando com o 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. quick hack com um servidor 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 maneira com um roteador:

    router#telnet myserver.com
    79.22.192.12
    

Desta forma, você pode fazê-lo funcionar na sua rede interna, se algum nat ou proxy estiver envolvido na comunicação e você quiser saber de qual IP você aparece.

Não requer nenhum serviço de terceiros.

    
por 10.11.2011 / 01:12
2

Para evitar depender de fontes externas, eu uso esperar, fazer telnet no meu roteador e obter o endereço IP da sua interface pública. Veja um exemplo de 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

Eu então executo o script acima assim para obter o ip público:

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

Claro, isso é baseado na suposição de que eu tenho acesso administrativo ao roteador, e é um roteador baseado no Linux, com o comando ifconfig disponível.

    
por 21.04.2013 / 06:11
1

Uma solução simples de script de shell pode ser encontrada aqui:

link

Funciona no Linux, FreeBSD, SunOS e Apple Darwin (com uma pequena modificação).

    
por 05.04.2010 / 23:30
1

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

Para uma maneira manual, você pode navegar em qualquer um dos sites acima, que retornará o ip do pedido de confirmação.

Para uma forma automatizada, você pode tentar:

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

que te dará a linha que contém o endereço IP na resposta http, então analise com sed, awk, etc

    
por 13.10.2009 / 18:34
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

    
por 26.11.2009 / 04:45
0
lynx --dump http://www.whatismyip.com/ | grep -o '[0-9].*\.[0-9].*\.[0-9].*\.[0-9].*'
-m1 
    
por 25.10.2010 / 08:52
0

Eu faço isso. Apenas me dá o IP sem qualquer envolvimento de terceiros ..

ip addr show | grep eth0 | grep inet | tr -s "" | cut -f3 -d "" | corte -f1 -d "/"

    
por 05.04.2011 / 07:56
0
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
    
por 30.01.2013 / 11:57
0

Aqui está outra alternativa que depende de quem resolve os negócios em torno do gerenciamento do IP dinâmico, e não dos sites de "serviço público" que podem desaparecer ou alterar o formato.

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

2) Instale a ferramenta de atualização dinâmica do serviço (reporta mudanças de IP para serviço).

Para obter o endereço IP em um script, faça o seguinte:

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

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

    
por 20.03.2013 / 18:05
0

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

IP privado

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

Script do 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 do 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"
    
por 11.04.2015 / 00:53