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-tree
instalado. De que outras maneiras posso obter meu IP externo?
linux
shell-script
ip
Eugene Yarmash
fonte
fonte
Respostas:
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.).
Usando
dig
com o OpenDNS como resolvedor:Talvez alias isso no seu,
bashrc
então é fácil lembrarResponde com um endereço IP simples:
Sintaxe
(Abreviado de https://ss64.com/bash/dig.html ) :
O
ANY
tipo de consulta retorna um registro AAAA ou A. Para preferir a conexão IPv4 ou IPv6 especificamente, use as opções-4
ou de-6
acordo.Para exigir que a resposta seja um endereço IPv4, substitua QUALQUER por
A
; para IPv6, substitua-o por.AAAA
Observe 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:
Alias de exemplo que solicita especificamente um endereço IPv4:
E para IPv6:
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
+short
opção de revelar os detalhes da consulta DNS. Por exemplo:fonte
myip.opendns.com
no DNS público do Google?curl http://canhazip.com
. Veja askubuntu.com/a/427092/2273NOTA: 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:
ou usando externalip :
O mais rápido usando HTTP:
ou usando externalip:
O mais rápido usando HTTPS com um certificado válido:
ou usando externalip:
Usando telnet:
Com o
nc
comando:ou usando externalip:
Com o
telnet
comando:Usando FTP:
ou usando externalip:
Todos os itens acima podem ser executados usando meu script externalip como:
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:
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:
Melhores tempos de resposta https:
(Nota: existem algumas respostas rápidas com conteúdo vazio - essas são inválidas.)
Melhores tempos médios de ping:
Aqui estão os resultados que obtive em 03/04/2015 em Amsterdã:
Melhores tempos de resposta http:
Melhores tempos de resposta https:
Melhores tempos médios de ping:
(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:
normalmente leva (hora real do relógio de parede) sobre:
Na verdade, existem quatro resolvedores que podem ser usados dessa maneira:
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:
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
nc
outelnet
comando (veja acima) geralmente leva:(Não há diferença perceptível entre
nc
etelnet
comandos.)FTP
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.
fonte
myip.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.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) ecurl http://canhazip.com
(36.71.64.71). Como posso decidir qual está correto?Local substituído pelo holandês que trabalha um.
fonte
-s
opçã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.whatismyip.com
removeu o serviço gratuito para verificar o IP externo. Então, receio que isso não esteja mais correto.icanhazip.com
ainda funciona.Desde whatsmyip.org e ifconfig.me já foram mencionados:
fonte
curl
soluções (embora válidas) ainda dependem de uma biblioteca externa (libcurl
).Você pode usar o ifconfig.me como alternativa ao whatismyip.org.
Além disso, o ifconfig.me possui algumas funcionalidades adicionais. Para descobrir que outras informações você pode receber, visite o site.
fonte
fonte
<img src='ipimg.php'/>
$ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
Amazon AWS
Saída de amostra:
Eu gosto disto porque:
fonte
Eu prefiro usar curlmyip.com É tão simples quanto:
curl curlmyip.com
É curto e simples de lembrar.
fonte
bash
- a intenção do OP -, você não pode prescindir da-s
opção mencionada em outras respostas.-s
switch 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
.OU
OU
OU
OU
OU
OU
OU
OU
OU
OU
OU
Referência
fonte
fonte
wget icanhazip.com
funciona.| tail -n1
parte e ver o que você começa a partir do proxynetcat icanhazip.com 80
. Parece que ele ignora$http_proxy
e os amigos, porque especificar o proxy e a porta-x
resultou em um processo interrompido.netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1
para um proxy HTTP básico (assumindo que esteja sendo executado na porta 3128). Obviamente, você obterá o endereço IP do proxy de volta.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).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
dig
ou 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.
Exemplo de uso (chamei o script
myip
):Comente a
verbose
variá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
fonte
Se você deseja usar o HTTPS para evitar possíveis armadilhas:
fonte
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.
Para obter o endereço IP em um script, basta:
Ó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.
fonte
Isso sempre funciona para mim, eu o uso no meu conky para obter meu endereço IP.
fonte
amazonaws
. Ou seja, se você não tem como pesquisar no Google. (nem mesmolynx
).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):
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 :fonte
O ifcfg.me suporta:
IPv4 e IPv6, ainda mais coisas com curl: ifcfg.me/?
fonte
nslookup
método se relaciona com odig
método na resposta de Krinkle ? Ambos usam DNS, certo? Então, posso passar alguma opção paradig
recuperar o mesmo registro DNS quenslookup
está fazendo aqui?dig +short . @ifcfg.me
se desejar #Eu executo um serviço de nuvem para minha família e fiz esse script rápido que eu executo
cron
todas 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.
fonte
Isso mostrará o endereço IP atual em uma janela pop-up:
fonte
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
fonte
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:onde
A.B.C.D
está o endereço IP da sua máquina na rede local eW.X.Y.Z
os servidores de endereços IP, como os sites veem de fora (e o que você está procurando). Usandosed
você pode reduzir a saída acima para apenas um endereço IP: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).
fonte
O Navegador de Texto Simples w3m é ótimo para o bash. Você pode usar
grep
etail
reduzir a resposta da seguinte maneira:fonte
Use curl para acessar o serviço ip de shtuff.it
fonte
Usando uma solicitação DNS mesmo atrás de um roteador NAT que traduz endereços DNS, isso pode funcionar:
ou, você pode usar o método de solicitação HTTP:
fonte