Como posso obter meu endereço IP externo em um script de shell?

273

Preciso encontrar meu endereço IP externo a partir de um script de shell. No momento eu uso esta função:

myip () { 
    lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}

Mas isso depende perl-libwww, perl-html-format, perl-html-treeinstalado. De que outras maneiras posso obter meu IP externo?

Eugene Yarmash
fonte
8
O que você quer dizer com IP externo? As duas respostas até agora usam HTTP. A resposta pode acabar sendo o IP do servidor proxy do seu ISP. (Que pode ser o que quiser.)
billpg
@billpg: Eu quero dizer o IP do roteador NAT
Eugene Yarmash
Você precisará de um serviço da Web que é meu IP que usa HTTPS. Infelizmente, eu não conheço nenhum.
billpg
1
@billpg ipcheckit.com
Gilles
checkip.amazonaws.com use isto de fornecedor conhecido
arulraj.net

Respostas:

442

Eu recomendo obtê-lo diretamente de um servidor DNS.

A maioria das outras respostas abaixo envolve passar por HTTP para um servidor remoto. Alguns deles exigiram análise da saída ou confiaram no cabeçalho User-Agent para fazer o servidor responder em texto sem formatação. Isso muda com bastante frequência (desça, mude o nome, coloque anúncios, pode alterar o formato da saída etc.).

  1. O protocolo de resposta DNS é padronizado (o formato permanecerá compatível).
  2. Historicamente, os serviços DNS ( OpenDNS , Google Public DNS , ..) tendem a sobreviver por muito mais tempo e são mais estáveis, mais escaláveis ​​e geralmente mais cuidados do que qualquer novo serviço HTTP do whatismyip.com atualmente em alta hoje.
  3. Este método é inerentemente mais rápido (seja apenas em alguns milissegundos!).

Usando digcom o OpenDNS como resolvedor:

dig @resolver1.opendns.com ANY myip.opendns.com +short

Talvez alias isso no seu, bashrcentão é fácil lembrar

alias wanip='dig @resolver1.opendns.com ANY myip.opendns.com +short'

Responde com um endereço IP simples:

$ wanip
80.100.192.168 # or, 2606:4700:4700::1111

Sintaxe

(Abreviado de https://ss64.com/bash/dig.html ) :

usage:  dig [@global-dnsserver] [q-type] <hostname> <d-opt> [q-opt]

    q-type   one of (A, ANY, AAAA, TXT, MX, ...). Default: A.

    d-opt    ...
             +[no]short          (Display nothing except short form of answer)
             ...

    q-opt    one of:
             -4                  (use IPv4 query transport only)
             -6                  (use IPv6 query transport only)
             ...

O ANYtipo de consulta retorna um registro AAAA ou A. Para preferir a conexão IPv4 ou IPv6 especificamente, use as opções -4ou de -6acordo.

Para exigir que a resposta seja um endereço IPv4, substitua QUALQUER por A; para IPv6, substitua-o por. AAAAObserve que ele pode retornar apenas o endereço usado para a conexão. Por exemplo, ao conectar-se pelo IPv6, ele não pode retornar o endereço A.

Servidores e exemplos alternativos

Além do OpenDNS, existem serviços DNS semelhantes fornecidos pela Akamai e pelo Google:

$ dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
80.100.192.168

$ dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
"80.100.192.168"

Alias ​​de exemplo que solicita especificamente um endereço IPv4:

alias wanip4='dig @resolver1.opendns.com A myip.opendns.com +short -4'

$ wanip4
80.100.192.168

E para IPv6:

alias wanip6='dig @resolver1.opendns.com AAAA myip.opendns.com +short -6'

$ wanip6
2606:4700:4700::1111

Solução de problemas

Se o comando não estiver funcionando por algum motivo, pode haver um problema com o provedor upstream, a ferramenta de linha de comando ou outra coisa. Para ajudar a entender por que não está funcionando, execute o comando sem a +shortopção de revelar os detalhes da consulta DNS. Por exemplo:

$ dig @resolver1.opendns.com ANY myip.opendns.com

;; Got answer: ->>HEADER<<- opcode: QUERY, status: NOERROR

;; QUESTION SECTION:
;myip.opendns.com.      IN  ANY

;; ANSWER SECTION:
myip.opendns.com.   0   IN  AAAA    2606:4700:4700::1111

;; Query time: 4 msec
;; WHEN: Fri Apr 11 00:00:01 GMT 2011
Timo Tijhof
fonte
18
você está certo que é muito rápido ..
Rahul Patil
4
@ Krinkle é uma excelente resposta. Existe um equivalente myip.opendns.comno DNS público do Google?
precisa
12
Eu achei que era ~ 19x mais rápido que curl http://canhazip.com. Veja askubuntu.com/a/427092/2273
Adam Monsen
3
Amo este limpa / sem dependências abordagem muito melhor do que todas as outras propostas, a menos que você é obrigado a porta 80
binaryanomaly
5
Observe que, em alguns casos, os roteadores que fornecem NAT também traduzem respostas DNS (você pode dar uma olhada em wiki.nil.com/Network_address_translation_of_DNS_responses ); Nesse caso, você deve recorrer a alguma resposta que recomende outra abordagem que não seja o DNS.
Razvan Stefanescu
146

NOTA: Trata-se de um endereço IP externo (aquele que os servidores na Internet veem quando você se conecta a eles) - se você deseja um endereço IP interno (aquele que o seu computador está usando para conexões, que pode ser diferente), consulte este resposta .

TL; DR - Métodos mais rápidos em 2015

O método mais rápido usando o DNS:

dig +short myip.opendns.com @resolver1.opendns.com

ou usando externalip :

externalip dns

O mais rápido usando HTTP:

curl -s http://whatismyip.akamai.com/

ou usando externalip:

externalip http

O mais rápido usando HTTPS com um certificado válido:

curl -s https://4.ifcfg.me/

ou usando externalip:

externalip https

Usando telnet:

Com o nccomando:

nc 4.ifcfg.me 23 | grep IPv4 | cut -d' ' -f4

ou usando externalip:

externalip telnet

Com o telnetcomando:

telnet 4.ifcfg.me 2>&1 | grep IPv4 | cut -d' ' -f4

Usando FTP:

echo close | ftp 4.ifcfg.me | awk '{print $4; exit}'

ou usando externalip:

externalip ftp

Todos os itens acima podem ser executados usando meu script externalip como:

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

Agora uma longa história ...

Existem muitas opções de servidores diferentes que fornecem o IP externo, especialmente via HTTP postado aqui ou em outro lugar.

Fiz um benchmark para ver se algum deles é melhor que os outros e fiquei surpreso com os resultados. Por exemplo, um dos ifconfig.me mais amplamente recomendado foi quase sempre o mais lento para mim, às vezes levando alguns segundos para responder. Muitos não funcionam com HTTPS ou funcionam, mas possuem certificados inválidos. Alguns têm tempos de resposta muito inconsistentes.

Benchmarks

HTTP e HTTPS

Esta é a fonte do meu script externalip-benchmark que eu usei:

Você pode executá-lo para ver quais serviços mencionados aqui valem a pena usar:

wget https://raw.githubusercontent.com/rsp/scripts/master/externalip-benchmark
chmod a+x externalip-benchmark
./externalip-benchmark

Meus resultados que obtive em 03/04/2015 de Varsóvia - os endereços foram alterados para proteger os inocentes:

Melhores tempos de resposta http:

0.086s http://ip.tyk.nu/ - answer='172.31.133.7'
0.089s http://whatismyip.akamai.com/ - answer='172.31.133.7'
0.091s http://tnx.nl/ip - answer='172.31.133.7'
0.117s http://ifcfg.me/ - answer='172.31.133.7'
0.156s http://l2.io/ip - answer='172.31.133.7'
0.317s http://ip.appspot.com/ - answer='172.31.133.7'
0.336s http://ident.me/ - answer='172.31.133.7'
0.338s http://ipof.in/txt - answer='172.31.133.7'
0.347s http://icanhazip.com/ - answer='172.31.133.7'
0.496s http://curlmyip.com/ - answer='172.31.133.7'
0.527s http://wgetip.com/ - answer='172.31.133.7'
0.548s http://curlmyip.com/ - answer='172.31.133.7'
0.665s http://bot.whatismyipaddress.com/ - answer='172.31.133.7'
0.665s http://eth0.me/ - answer='172.31.133.7'
1.041s http://ifconfig.me/ - answer='172.31.133.7'
1.049s http://corz.org/ip - answer='172.31.133.7'
1.598s http://ipecho.net/plain - answer='172.31.133.7'

Melhores tempos de resposta https:

0.028s https://curlmyip.com/ - answer=''
0.028s https://curlmyip.com/ - answer=''
0.029s https://l2.io/ip - answer=''
0.029s https://tnx.nl/ip - answer=''
0.072s https://whatismyip.akamai.com/ - answer=''
0.113s https://ipecho.net/plain - answer=''
0.117s https://ident.me/ - answer=''
0.207s https://ip.tyk.nu/ - answer='172.31.133.7'
0.214s https://ipof.in/txt - answer='172.31.133.7'
0.259s https://ifcfg.me/ - answer='172.31.133.7'
0.289s https://corz.org/ip - answer=''
0.436s https://ip.appspot.com/ - answer='172.31.133.7'
0.448s https://bot.whatismyipaddress.com/ - answer=''
0.454s https://eth0.me/ - answer=''
0.673s https://icanhazip.com/ - answer='172.31.133.7'
5.255s https://ifconfig.me/ - answer=''
10.000s https://wgetip.com/ - answer=''

(Nota: existem algumas respostas rápidas com conteúdo vazio - essas são inválidas.)

Melhores tempos médios de ping:

10.210 //whatismyip.akamai.com/
36.820 //tnx.nl/ip
37.169 //ip.tyk.nu/
39.412 //ipof.in/txt
40.967 //ident.me/
41.257 //ipecho.net/plain
43.918 //ifcfg.me/
45.720 //l2.io/ip
64.749 //ip.appspot.com/
123.412 //corz.org/ip
134.245 //wgetip.com/
157.997 //icanhazip.com/
161.613 //curlmyip.com/
162.100 //curlmyip.com/
268.734 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/

Aqui estão os resultados que obtive em 03/04/2015 em Amsterdã:

Melhores tempos de resposta http:

0.021s http://ipecho.net/plain - answer='172.31.13.37'
0.027s http://tnx.nl/ip - answer='172.31.13.37'
0.035s http://whatismyip.akamai.com/ - answer='172.31.13.37'
0.039s http://ifcfg.me/ - answer='172.31.13.37'
0.045s http://l2.io/ip - answer='172.31.13.37'
0.142s http://ident.me/ - answer='172.31.13.37'
0.144s http://ipof.in/txt - answer='172.31.13.37'
0.150s http://ip.appspot.com/ - answer='172.31.13.37'
0.150s http://ip.tyk.nu/ - answer='172.31.13.37'
0.170s http://icanhazip.com/ - answer='172.31.13.37'
0.190s http://eth0.me/ - answer='172.31.13.37'
0.191s http://wgetip.com/ - answer='172.31.13.37'
0.301s http://curlmyip.com/ - answer='172.31.13.37'
0.330s http://bot.whatismyipaddress.com/ - answer='172.31.13.37'
0.343s http://curlmyip.com/ - answer='172.31.13.37'
0.485s http://corz.org/ip - answer='172.31.13.37'
3.549s http://ifconfig.me/ - answer='172.31.13.37'

Melhores tempos de resposta https:

0.004s https://curlmyip.com/ - answer=''
0.012s https://curlmyip.com/ - answer=''
0.012s https://tnx.nl/ip - answer=''
0.016s https://ipecho.net/plain - answer=''
0.071s https://whatismyip.akamai.com/ - answer=''
0.096s https://ifcfg.me/ - answer='172.31.13.37'
0.097s https://ident.me/ - answer=''
0.187s https://corz.org/ip - answer=''
0.187s https://ip.appspot.com/ - answer='172.31.13.37'
0.189s https://ip.tyk.nu/ - answer='172.31.13.37'
0.195s https://eth0.me/ - answer=''
0.253s https://l2.io/ip - answer=''
0.300s https://ipof.in/txt - answer='172.31.13.37'
0.324s https://bot.whatismyipaddress.com/ - answer=''
0.512s https://icanhazip.com/ - answer='172.31.13.37'
1.272s https://ifconfig.me/ - answer=''
10.002s https://wgetip.com/ - answer=''

Melhores tempos médios de ping:

1.020 //ipecho.net/plain
1.087 //whatismyip.akamai.com/
5.011 //ip.appspot.com/
6.942 //ident.me/
7.017 //ipof.in/txt
8.209 //tnx.nl/ip
11.343 //ip.tyk.nu/
12.647 //ifcfg.me/
13.828 //l2.io/ip
81.642 //icanhazip.com/
85.447 //wgetip.com/
91.473 //corz.org/ip
102.569 //curlmyip.com/
102.627 //curlmyip.com/
247.052 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/

(Os 999999 pings significam 100% de perda de pacotes.)

DNS

Para uma comparação, há momentos em que outros métodos são testados em 16/06/2015 em Varsóvia e Amsterdã.

Usando:

time dig +short myip.opendns.com @resolver1.opendns.com

normalmente leva (hora real do relógio de parede) sobre:

  • 0.035s de Varsóvia
  • 0.015s de Amsterdã

Na verdade, existem quatro resolvedores que podem ser usados ​​dessa maneira:

  • resolv1.opendns.com
  • resolv2.opendns.com
  • resolv3.opendns.com
  • resolv4.opendns.com

Todos oferecem os mesmos tempos de resposta em Varsóvia e Amsterdã, mas isso pode não ser o caso em outros locais.

Usando 208.67.222.222 - o IP do resolv1.opendns.com em vez de seu nome de domínio é mais rápido:

  • 0,023s de Varsóvia
  • 0,009s de Amsterdã

mas pode não funcionar no futuro se o IP mudar (embora seja improvável para um resolvedor DNS conhecido - talvez eu deva usar o IP no meu script externalip - por favor, comente).

Telnet

Telnet com ncou telnetcomando (veja acima) geralmente leva:

  • 0.103s de Varsóvia
  • 0.035s de Amsterdã

(Não há diferença perceptível entre nce telnetcomandos.)

FTP

  • 0.104s de Varsóvia
  • 0.036s de Amsterdã

Nomes de domínio

Todos os métodos serão mais rápidos (especialmente quando executados pela primeira vez) quando endereços IP serão usados ​​em vez dos nomes de domínio dos serviços fornecidos (exceto com HTTP que pode usar servidores virtuais baseados em host e não funcionar com IP simples - não testado) mas parará de funcionar quando os serviços alterarem o endereço IP, para que seja mais rápido, mas menos à prova de futuro.

Comentários

Se você vir alguns resultados interessantes da sua localização ou se achar que alguns outros hosts devem ser recomendados em vez daqueles que eu escolhi, por favor, poste um comentário. Se houver algum serviço importante ausente, comente ou publique um problema no GitHub. Gostaria de manter esta postagem atualizada com uma escolha atual dos serviços com melhor desempenho.

rsp
fonte
2
Você comparou omyip.opendns.com método DNS como na resposta de Krinkle ? Atualmente, parece que ele é o vencedor por padrão, por desconhecer outros fornecedores desse método, mas ainda assim seria útil comparar com os outros métodos.
James Haigh
@ JamesHaigh Obrigado pela sugestão. Adicionei DNS e outros métodos (telnet, ftp) à resposta. O método mais rápido parece ser o DNS usando diretamente o endereço IP (em vez do nome do domínio) do resolvedor.
RSP
Você deve adicionar / testar canhazip.com / canhazip.com também (HTTP e HTTPS).
Xxdesmus 22/08/2015
Você pode adicionar myip.addr.space à sua lista. Eu mesmo construí isso, pois não estava particularmente satisfeito com nenhum dos outros que havia visto na época.
Michael Hampton
Às vezes, obtenho resultados diferentes usando dig +short myip.opendns.com @resolver1.opendns.com(36.86.63.180), dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short(118.98.115.34) e curl http://canhazip.com(36.71.64.71). Como posso decidir qual está correto?
Sutandiono 12/09/16
80
 curl -s http://whatismijnip.nl |cut -d " " -f 5

Local substituído pelo holandês que trabalha um.

Maciek Sawicki
fonte
3
+1 Eu sabia sobre o whatismyip.com, mas não o whatismyip.org, isso é incrível.
Julian
Nunca soube disso! Ótimo site!
bbosak
2
@MaciekSawicki A -sopção é realmente necessária neste caso? Eu tentei com / sem ele no meu fedora 15 - bash 4.2.10 (1) e funcionou de ambos os modos.
ztank1013
4
Parece não funcionar mais via CLI, mas ir para a página da Web a partir de um navegador da Web funciona. Estou usando o openSUSE 12.1 x64.
SaultDon
5
whatismyip.comremoveu o serviço gratuito para verificar o IP externo. Então, receio que isso não esteja mais correto. icanhazip.comainda funciona.
precisa saber é
54

Desde whatsmyip.org e ifconfig.me já foram mencionados:

curl -s icanhazip.com
joschi
fonte
4
Outro: ip.appspot.com ou ip.appspot.com
Lekensteyn
1
Esses dois suportam IPv6.
21413 Josh Lee
1
@ JoshLee, observe que icanhazip também suporta ipv6. Além disso, uma observação ao OP, todas essas curlsoluções (embora válidas) ainda dependem de uma biblioteca externa ( libcurl).
HalosGhost
Outro: ifcfg.me
Eun
18

Você pode usar o ifconfig.me como alternativa ao whatismyip.org.

curl -s http://ifconfig.me

Além disso, o ifconfig.me possui algumas funcionalidades adicionais. Para descobrir que outras informações você pode receber, visite o site.

Mr. Deathless
fonte
5
É extremamente lento . Costumo obter tempos de resposta superiores a 30 segundos, às vezes até mais de um minuto! Às vezes, é meio segundo (o que ainda é muito) e depois são 15 segundos ou mais. Isso é testado em diferentes locais. Veja minha resposta para mais informações e referências.
Rsp
15
wget -O - -q http://whatismyip.org/
ztank1013
fonte
3
Eu não era capaz de obter o meu IP como este, apenas dá-lo como:<img src='ipimg.php'/>
Yuugian
Consegui trabalhar com um monte de magia regex decente, mas não foi fácil. Se você insistir em usar este serviço, certifique-se de $ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
agrupar
13

Amazon AWS

curl https://checkip.amazonaws.com

Saída de amostra:

123.123.123.123

Eu gosto disto porque:

  • retorna apenas o IP de texto simples, nada mais
  • é de um provedor conhecido que dificilmente ficará offline tão cedo
Ciro Santilli adicionou uma nova foto
fonte
9

Eu prefiro usar curlmyip.com É tão simples quanto:

curl curlmyip.com

É curto e simples de lembrar.

Garrett Fogerlie
fonte
Para uso em bash- a intenção do OP -, você não pode prescindir da -sopção mencionada em outras respostas.
Serge Stroobandt
3
@SergeStroobandt Sim, você pode. Tudo o que o -sswitch faz é executá-lo no modo silencioso, ou seja. mensagens de erro não serão exibidas. Então, tudo se resume a como ele deseja que seu script lide com erros. O próprio comando retornará um endereço IP da maneira mais confiável possível -s.
Garrett Fogerlie
1
Até agora, este site era o mais confiável em vários testes.
Amos Shapira
9
curl ident.me

OU

curl ifconfig.me

OU

curl tnx.nl/ip

OU

curl ipecho.net/plain

OU

curl ip.appspot.com

OU

curl whatismyip.akamai.com

OU

curl icanhazip.com

OU

curl wgetip.com

OU

curl ip.tyk.nu

OU

curl curlmyip.com

OU

curl corz.org/ip

OU

curl bot.whatismyipaddress.com

Referência

Mandar Shinde
fonte
6
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1
Eugene Yarmash
fonte
Saída em branco aqui, embora o site funcione. Alguma idéia do porquê? Estou atrás de um proxy, se isso for relevante, mas wget icanhazip.comfunciona.
L0b0
@ l0b0 Tente omitir a | tail -n1parte e ver o que você começa a partir do proxy
Eugene Yarmash
Nada, apenas saia do código 1. O mesmo vale para netcat icanhazip.com 80. Parece que ele ignora $http_proxye os amigos, porque especificar o proxy e a porta -xresultou em um processo interrompido.
L0b0
@ l0b0: netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1para um proxy HTTP básico (assumindo que esteja sendo executado na porta 3128). Obviamente, você obterá o endereço IP do proxy de volta.
Tripleee
1
O HTTP 1.0 não possui o Host:cabeçalho da solicitação - a hospedagem virtual baseada em nome foi uma das principais melhorias no HTTP 1.1. Altere a solicitação para especificar HTTP / 1.1 ou remova o cabeçalho Host (eu recomendo o primeiro).
um CVn 04/07/2013
4

Se, depois de ler todas essas sugestões, você quiser ler ainda mais, aqui está um script Bash discutido em excesso.

Ele contém uma lista de servidores DNS e HTTP que parecem funcionar bem em fevereiro de 2017.

Se você tiver dig, primeiro tente o DNS, que é quase uma ordem de magnitude mais rápida que os vários serviços HTTP.

Ele sai na primeira resposta que recebe.

Se você não possui digou todos os servidores DNS falharam, ele tenta os serviços HTTP até receber uma resposta.

Os servidores são listados em ordem alfabética, mas são embaralhados antes do uso para evitar sempre o uso do mesmo.

#!/bin/bash

## Get my external IP

timeout=2   # seconds to wait for a reply before trying next server
verbose=1   # prints which server was used to STDERR

dnslist=(
    "dig +short            myip.opendns.com        @resolver1.opendns.com"
    "dig +short            myip.opendns.com        @resolver2.opendns.com"
    "dig +short            myip.opendns.com        @resolver3.opendns.com"
    "dig +short            myip.opendns.com        @resolver4.opendns.com"
    "dig +short    -t txt  o-o.myaddr.l.google.com @ns1.google.com"
    "dig +short -4 -t a    whoami.akamai.net       @ns1-1.akamaitech.net"
    "dig +short            whoami.akamai.net       @ns1-1.akamaitech.net"
)

httplist=(
    4.ifcfg.me
    alma.ch/myip.cgi
    api.infoip.io/ip
    api.ipify.org
    bot.whatismyipaddress.com
    canhazip.com
    checkip.amazonaws.com
    eth0.me
    icanhazip.com
    ident.me
    ipecho.net/plain
    ipinfo.io/ip
    ipof.in/txt
    ip.tyk.nu
    l2.io/ip
    smart-ip.net/myip
    tnx.nl/ip
    wgetip.com
    whatismyip.akamai.com
)



# function to shuffle the global array "array"
shuffle() {
   local i tmp size max rand
   size=${#array[*]}
   max=$(( 32768 / size * size ))
   for ((i=size-1; i>0; i--)); do
      while (( (rand=$RANDOM) >= max )); do :; done
      rand=$(( rand % (i+1) ))
      tmp=${array[i]} array[i]=${array[rand]} array[rand]=$tmp
   done
}


## if we have dig and a list of dns methods, try that first
if hash dig 2>/dev/null && [ ${#dnslist[*]} -gt 0 ]; then
    eval array=( \"\${dnslist[@]}\" )
    shuffle

    for cmd in "${array[@]}"; do
        [ "$verbose" == 1 ] && echo Trying: $cmd 1>&2
        ip=$(timeout $timeout $cmd)
        if [ -n "$ip" ]; then
            echo $ip
            exit
        fi
    done
fi


# if we haven't succeeded with DNS, try HTTP

if [ ${#httplist[*]} == 0 ]; then
    echo "No hosts in httplist array!" >&2
    exit 1
fi

# use curl or wget, depending on which one we find
curl_or_wget=$(if hash curl 2>/dev/null; then echo "curl -s"; elif hash wget 2>/dev/null; then echo "wget -qO-"; fi);

if [ -z "$curl_or_wget" ]; then
    echo "Neither curl nor wget found. Cannot use http method." >&2
    exit 1
fi

eval array=( \"\${httplist[@]}\" )
shuffle

for url in "${array[@]}"; do
    [ "$verbose" == 1 ] && echo Trying: $curl_or_wget  "$url" 1>&2
    ip=$(timeout $timeout $curl_or_wget "$url")
    if [ -n "$ip" ]; then
        echo $ip
        exit
    fi
done

Exemplo de uso (chamei o script myip):

$ myip
Trying: dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com
"151.101.65.69"

$ ip=$(myip); echo "IP = '$ip'"
Trying: dig +short myip.opendns.com @resolver1.opendns.com
IP = '151.101.65.69'

Comente a verbosevariável na parte superior do script para evitar a impressão do servidor usado.

Atualização: agora este script também está no Github, onde eu posso atualizá-lo quando necessário:
https://github.com/mivk/myip

mivk
fonte
3

Se você deseja usar o HTTPS para evitar possíveis armadilhas:

_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"
Chris Down
fonte
2
Talvez você possa explicar quais são as armadilhas potenciais que está evitando aqui.
Caleb
O domínio ipcheckit.com aparentemente está à venda e não hospeda mais o serviço de exibição de endereço IP.
precisa saber é
ah, as armadilhas de scripts de WriteOnly :)
Ярослав Рахматуллин
@ Chris Down A técnica ainda é válida, você só precisa de outro site compatível com SSL para usá-lo.
Caleb
3

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
3

Isso sempre funciona para mim, eu o uso no meu conky para obter meu endereço IP.

wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'
Dai_Trying
fonte
+1 Embora pareça tão desajeitada, essa abordagem me salvou algumas vezes. Porque a Internet não é WWW . Você pode ter acesso à Internet, mas pode (geralmente em salas de servidores) estar condenado a um console que não seja da GUI e, nesse caso, é importante lembrar de cor um dos URLs do serviço checkIP. E como esse é bastante comum, é aparentemente compilado, pois você provavelmente se lembrará mais do DynDNS do que do outro amazonaws. Ou seja, se você não tem como pesquisar no Google. (nem mesmo lynx).
Syntaxerror
3

Como não confio na conexão ou no serviço, uso o código a seguir, que tenta obter o IP usando serviços diferentes (fique à vontade para adicionar mais):

# Get my ip address and put in a file
declare -a arr=("ipecho.net/plain" "ident.me" "tnx.nl/ip" "ip.appspot.com" "https://shtuff.it/myip/short/")
IP=$(curl -s --retry 3 --retry-delay 10 ipecho.net/plain)

while [ -z "$IP" ] # If no IP found yet, keep trying!
do
    sleep 30
    IP=$(curl -s --retry 3 --retry-delay 10 ${arr[$((  RANDOM % ${#arr[@]}  ))]})  
done

echo -n "$IP" >  /root/clientIP.txt #puts ip address in clientIP.txt
echo "Our address is $IP" 

Para adicionar mais robustez (por exemplo, se um dos serviços alterar seu formato), você pode verificar se $IPé um IP válido usando a seguinte função :

# Verify that the parameter passed is an IP Address:
# http://zindilis.com/blog/2013/05/10/bash-check-that-string-is-ip.html
# @Author: Marios Zindilis
# @License: Creative Commons Attribution-ShareAlike 4.0 International License.
# @Date: 2013-05-10
function is_IP() {
if [ `echo $1 | grep -o '\.' | wc -l` -ne 3 ]; then
        echo "Parameter '$1' does not look like an IP Address (does not contain 3 dots).";
        exit 1;
elif [ `echo $1 | tr '.' ' ' | wc -w` -ne 4 ]; then
        echo "Parameter '$1' does not look like an IP Address (does not contain 4 octets).";
        exit 1;
else
        for OCTET in `echo $1 | tr '.' ' '`; do
                if ! [[ $OCTET =~ ^[0-9]+$ ]]; then
                        echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' is not numeric).";
                        exit 1;
                elif [[ $OCTET -lt 0 || $OCTET -gt 255 ]]; then
                        echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' in not in range 0-255).";
                        exit 1;
                fi
        done
fi

return 0;
}
Franck Dernoncourt
fonte
3

O ifcfg.me suporta:

curl ifcfg.me
nslookup . ifcfg.me
telnet ifcfg.me
ftp ifcfg.me
finger @ifcfg.me

IPv4 e IPv6, ainda mais coisas com curl: ifcfg.me/?

Eu n
fonte
Como o nslookupmétodo se relaciona com o digmétodo na resposta de Krinkle ? Ambos usam DNS, certo? Então, posso passar alguma opção para digrecuperar o mesmo registro DNS que nslookupestá fazendo aqui?
James Haigh
Sim, você pode usar dig +short . @ifcfg.mese desejar #
Eun
2

Eu executo um serviço de nuvem para minha família e fiz esse script rápido que eu executo crontodas as manhãs às 5, porque sou barato e não comprarei um IP estático.

Ele pega o IP público e envia por e-mail para meus usuários. Fiz email em formato de hiperlink para que minha mãe não precise digitar as portas nem nada. Talvez alguém possa usá-lo.

#!/bin/bash
ipvariable=$(wget http://ipecho.net/plain -O - -q);

echo "Today the location is http://$ipvariable:123456/foldertheyreach" | mail -s   "From your friendly cloud service provider" user1@someemail.com, user2@ect.com
Vai
fonte
1

Isso mostrará o endereço IP atual em uma janela pop-up:

zenity --info --text "$(curl -s icanhazip.com)"
basic6
fonte
1

Eu configurei um serviço que retorna o endereço IP como JSON / XML ou texto sem formatação. Você pode encontra-los aqui

http://ipof.in/txt

A mesma URL com / json e / xml também fornecerá outros formatos

Se você deseja HTTPS, pode usar os mesmos URLs com prefixo https. A vantagem é que, mesmo se você estiver em um Wifi, obterá o endereço público.

Portanto, um alias simples myip = "curl https://ipof.in/txt " obterá seu IP

vivekv
fonte
1

Como alternativa, você pode usar o STUN, que foi inventado para responder a essa pergunta de maneira automatizada e é amplamente utilizado em comunicações na Internet, por exemplo, pelo SIP e WebRTC .

Usando um stunclient (no debian / ubuntu do apt-get install stuntman-client) simplesmente faça:

$ stunclient stun.services.mozilla.com
Binding test: success
Local address: A.B.C.D:42541
Mapped address: W.X.Y.Z:42541

onde A.B.C.Destá o endereço IP da sua máquina na rede local e W.X.Y.Zos servidores de endereços IP, como os sites veem de fora (e o que você está procurando). Usando sedvocê pode reduzir a saída acima para apenas um endereço IP:

stunclient stun.services.mozilla.com |
    sed -ne "s/^Mapped address: \(.*\):.*$/\1/p"

Para uma pesquisa alternativa do STUN usando nada além de ferramentas básicas de linha de comando, veja minha resposta no AskUbuntu (pretendido como um exercício divertido, não para uso em produção).

Victor Klos
fonte
0

O Navegador de Texto Simples w3m é ótimo para o bash. Você pode usar grepe tailreduzir a resposta da seguinte maneira:

w3m -no-cookie -dump "http://www.whatismyip.com/" | grep -A 1 -m 1 "Your IP:" | tail -n 1
McPeppr
fonte
0

Use curl para acessar o serviço ip de shtuff.it

curl -s https://shtuff.it/myip/short
Chris Montanaro
fonte
301 Movido permanentemente
McPeppr 8/16
o link está morto agora
Eugene Bujak
0

Usando uma solicitação DNS mesmo atrás de um roteador NAT que traduz endereços DNS, isso pode funcionar:

$ dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com | cut -d'"' -f2
x.y.z.t

ou, você pode usar o método de solicitação HTTP:

$ curl -s ipinfo.io/ip
x.y.z.t
SebMa
fonte
1
Por que você recomendaria um sobre o outro?
roaima
@roaima Você está certo, cabe a cada usuário decidir.
SebMa