Comando para determinar meu IP público?


637

Se eu verificar com o google , posso ver meu IP público. Existe algo na linha de comando do Ubuntu que me dará a mesma resposta?


2
"ter IP dinâmico", "SSH usando outro sistema na Internet", "o comando que exibirá o atual IP PÚBLICO". Você vê o problema do ovo / galinha aqui? Como você seria capaz de executar comandos em um servidor remoto sem saber seu endereço? Você pode estar mais interessado em serviços como no-ip.com / DynDNS.org.
precisa saber é

não é possível fazer o SSH sem conhecer o IP público, meu amigo ... o dynDNS custa muito e não funciona muito bem, mas a situação não permite isso ... de qualquer maneira a pergunta já foi respondida .. obrigado pela sua sugestão
Bhavesh Diwan

1
PS duckduckgo.com/?q=ip (sem linha de comando, mas não é grande irmão G nem)
Campa

1
Talvez essa deva ser uma pergunta separada, mas eu gostaria de ver um alerta quando meu endereço IP público mudar. Por enquanto, estou apenas usando as seguintes respostas em um crontab com notify-send.
PJ Brunet

ótimas soluções abaixo. Para uso do Centos: em ifconfig eth1 | sed -nre '/^[^ ]+/{N;s/^([^ ]+).*inet *([^ ]+).*/\2/p}'que eth1 é o dispositivo de rede de interesse, você pode omitir a string 'et1' para mostrar todos os ips de todos os adaptadores. Em vez de \2você pode escrever \1 \2para mostrar os nomes de cada adaptador também.
Hafenkranich 27/10

Respostas:


916

Se você não estiver atrás de um roteador, poderá descobrir usando ifconfig.

Se você estiver atrás de um roteador, seu computador não saberá sobre o endereço IP público, pois o roteador faz uma conversão de endereço de rede. Você pode perguntar a algum site qual seu endereço IP público está usando curlou wgetextrair dele as informações necessárias:

curl -s https://checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'  

ou mais curto

curl https://ipinfo.io/ip

27
ty - logo após eu postar, percebi que não havia pesquisado no google primeiro: parece que isso funcionará curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//' Outras possibilidades estão listadas aqui: go2linux.org/what-is-my-public-ip-address-with-linux
precisa saber é o seguinte

1
certeza - você pode adicioná-la a sua resposta
kfmfe04

1
Para esclarecer: isso foi um truque e muito feio, por isso fiz uma edição para torná-lo mais simples e algo que as pessoas possam lembrar.
jrg

2
Exatamente como Giovanni P afirmou. O OP deve alterar a resposta aceita.
Loostro

36
enrolar -s ipinfo.io/ip
chao

385

Para encontrar o ip externo, você pode usar serviços externos baseados na Web ou métodos baseados no sistema. Quanto mais fácil for usar o serviço externo, também as ifconfigsoluções baseadas funcionarão no seu sistema somente se você não estiver atrás de um NAT. os dois métodos foram discutidos abaixo em detalhes.

Localizando IP externo usando serviços externos

A maneira mais fácil é usar um serviço externo por meio de um navegador de linha de comando ou ferramenta de download. Como wgetestá disponível por padrão no Ubuntu, podemos usá-lo.
Para encontrar seu ip, use-

$ wget -qO- https://ipecho.net/plain ; echo

Cortesia :

Você também pode usar lynx(navegador) ou curlno lugar de wgetpequenas variações do comando acima, para encontrar seu ip externo.

Usando curlpara encontrar o ip:

$ curl https://ipecho.net/plain

Para uma saída melhor formatada, use:

$ curl https://ipecho.net/plain ; echo

Um método mais rápido (sem dúvida o mais rápido) usando digwith OpenDNScomo resolvedor:

As outras respostas aqui passam por HTTP para um servidor remoto. Alguns deles exigem análise da saída ou dependem do cabeçalho User-Agent para fazer o servidor responder em texto sem formatação. Eles também mudam com bastante frequência (desça, mude o nome, publique 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, escaláveis ​​e geralmente tomados em conta do que qualquer novo serviço HTTP de whatismyip.com atualmente em alta hoje.
  3. (para aqueles geeks que se preocupam com a micro-otimização), esse método deve ser inerentemente mais rápido (seja por apenas alguns segundos).

Usando dig com o OpenDNS como resolvedor:

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

111.222.333.444

Copiado de: https://unix.stackexchange.com/a/81699/14497

Localizando IP externo sem depender de serviços externos

  • Se você souber o nome da sua interface de rede

Digite o seguinte no seu terminal:

$ LANG=c ifconfig <interface_name> | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'

No exemplo acima, substitua <interface_name>com o nome de sua interface real, por exemplo: eth0, eth1, pp0, etc ...

Exemplo de uso:

$ LANG=c ifconfig ppp0 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'
111.222.333.444
  • Se você não souber o nome da sua interface de rede

Digite o seguinte no seu terminal (isso obtém o nome e o endereço IP de cada interface de rede no seu sistema):

$ LANG=c ifconfig | grep -B1 "inet addr" |awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' |awk -F: '{ print $1 ": " $3 }'

Exemplo de uso:

$ LANG=c ifconfig | grep -B1 "inet addr" |awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' |awk -F: '{ print $1 ": " $3 }'
lo: 127.0.0.1
ppp0: 111.222.333.444

Nota: as saídas são indicativas e não reais.

Cortesia: https://www.if-not-true-then-false.com/2010/linux-get-ip-address/

ATUALIZAR

  1. LANG=cfoi adicionado aos ifconfigusos baseados, para que sempre forneça a saída em inglês, independentemente da configuração da localidade.

1
@ Z9iT, com certeza .. Ele deve funcionar em qualquer distribuição Linux, desde que você tenha o wget instalado. Como foi dito, se você já tem cachos ou linces disponíveis, use-os. Você precisaria de permissão root para instalar, então usesudo apt-get install wget
saji89

13
Os comandos com ifconfig funcionam apenas se você não estiver atrás de um NAT.
Lukassteiner

1
basta usar -wopção de onda em vez de echo :)curl -w '\n' ident.me
drAlberT

3
Esta proposta usando dig é bastante agradável unix.stackexchange.com/questions/22615/...
binaryanomaly

4
A última versão sem serviços externos funciona apenas se o computador estiver conectado diretamente à Internet, o que raramente acontece, caso contrário, você obterá apenas o seu endereço IP local.
rubo77

117

O meu favorito sempre foi:

curl ifconfig.me

simples, fácil de digitar.

Você precisará instalar o curl primeiro;)

Se o ifconfig.me estiver desativado, tente icanhazip.com e ou ipecho.net

curl icanhazip.com

ou

curl ipecho.net

3
@ Z9iT, acabei de verificar isso agora. Sim, seria emitido o ip externo no seu terminal.
precisa saber é o seguinte

7
O tempo de resposta de ifconfig.meparece um pouco mais lento que ipecho.net.
Drew Noakes

3
Se você não tem, curlmas tem wget:wget -U curl -qO- ifconfig.me
Stéphane Chazelas 14/08

2
O ifconfig.me não parece estar respondendo :(
Asfand Qazi

1
@AsfandYarQazi - trabalhando aqui. Você pode tentar uma das alternativas, icanhazip.com
Panther

60

icanhazip.com é o meu favorito.

curl icanhazip.com

Você pode solicitar o IPv4 explicitamente:

curl ipv4.icanhazip.com

Se você não possui, curlpode usar wget:

wget -qO- icanhazip.com

Obrigado! Eu tive que tentar muitas sugestões acima, até encontrar algumas que são compatíveis com IPv6. É uma pena que esses serviços geralmente ainda sejam apenas IPv4.
Vladimír Čunát

48

Eu achei tudo chato e lento, então escrevi o meu. É simples e rápido.

Sua API está em http://api.ident.me/

Exemplos:

curl ident.me
curl v4.ident.me
curl v6.ident.me

1
Uau, isso foi muito rápido!
amigos estão dizendo sobre waldyrious

1
Acho a solução icanhazip.com mais rápida e inclui uma nova linha na saída.
Tyler Collier

1
Sim, era realmente mais rápido ultimamente. Apenas alterei minha solução.
Pierre Carrier

2
Parabéns! 2 anos e você ainda está mantendo. Bem feito. "Identificar ME", é o que me vem à mente, quando eu preciso de verificação ip :)
Mohnish

AWS é mais rápido time curl http://checkip.amazonaws.com-> 0.91svs .241spara ident.meVamos apenas rezar AWS does not ir para baixo;)
Avindra Goolcharan

42

Você pode usar uma solicitação DNS em vez de HTTP para descobrir seu IP público:

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

Ele usa o resolver1.opendns.comservidor DNS para resolver o myip.opendns.comnome do host mágico para o seu endereço IP.


3
Isso é realmente rápido. Fiz uma execução de aquecimento, depois 10 execuções cada uma dessas e curl icanhazip.com. Média da curlversão: 174ms. Média para a versão somente DNS: 9ms. ~ 19x mais rápido. Veja também: unix.stackexchange.com/a/81699/8383
Adam Monsen

1
@AdamMonsen Obrigado pelo link. O ponto de usar o DNS (como a resposta que você vinculou diz) é que a resposta é padrão (e improvável que seja alterada) e o serviço (OpenDNS) pode permanecer mais tempo do que a maioria de suas alternativas http. O tempo necessário para fazer a solicitação pode ser obscurecido pelo tempo de inicialização do comando.
jfs

Sim. Eu não ficaria surpreso se curlele fosse mais lento do que dig. Mesmo se eles fossem reescritos para serem o mais parecidos possível, curlainda seriam mais lentos; ele usa HTTP ( incluindo DNS) e digusa apenas DNS.
111315 Adam Monsen

22

Amazon AWS

curl http://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

18

O que eu estou usando é:

wget -O - -q icanhazip.com

Sim, você pode ter ip :-)


3
Prefiro que curl icanhazip.comàs vezes wgetseja o único disponível, mas às vezes também não wgetesteja disponível e curlseja sua única opção (como o OS / X). De qualquer maneira curl icanhazip.comé quase tão fácil quanto curl ifconfig.memuito mais engraçado ;-)
TryTryAgain

11

Digite exatamente isso, pressione Enteronde indicado:

telnet ipecho.net 80Enter
GET /plain HTTP/1.1Enter
HOST: ipecho.net Enter
BROWSER: web-kitEnter
Enter

Isso envia manualmente uma solicitação HTTP, que retornará seu IP na parte inferior de um HTTP/1.1 200 OK reply

Exemplo de saída:

$ telnet ipecho.net 80
Trying 146.255.36.1...
Connected to ipecho.net.
Escape character is '^]'.
GET /plain HTTP/1.1
HOST: ipecho.net
BROWSER: web-kit

HTTP/1.1 200 OK
Date: Tue, 02 Jul 2013 07:11:42 GMT
Server: Apache
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-cache
Pragma: no-cache
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html

f
111.222.333.444
0

6
Bom, isso funcionou bem, não ter que instalar o curl foi uma vantagem para mim: um liner: printf "GET / HTTP simples / 1.1 \ nHOST: ipecho.net \ nBROWSER: web-kit \ n \ n" | nc ipecho.net 80
Ozônio

9

Outro rápido (pode muito bem ser o mais rápido, relativamente)

curl ipecho.net/plain

9

Para isso, o STUN foi inventado. Como cliente, você pode enviar uma solicitação para um servidor STUN disponível ao público e devolver o endereço IP que vê. É o nível mais baixo de whatismyip.com, pois ele não usa servidores HTTP e DNS inteligentes, mas o protocolo STUN, extremamente rápido.

Usando stunclient

Se você stunclientinstalou ( apt-get install stuntman-clientno debian / ubuntu), você pode simplesmente:

$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 -n -e "s/^Mapped address: \(.*\):.*$/\1/p"

No entanto, sua pergunta foi como encontrá-lo usando a linha de comando, o que pode excluir o uso de um cliente STUN. Então eu me pergunto ...

Usando bash

Uma solicitação STUN pode ser artesanal, enviada para um servidor STUN externo usando netcate ser pós-processada usando dd, hexdumpe sedassim:

$echo -en '\x00\x01\x00\x08\xc0\x0c\xee\x42\x7c\x20\x25\xa3\x3f\x0f\xa1\x7f\xfd\x7f\x00\x00\x00\x03\x00\x04\x00\x00\x00\x00' |
    nc -u -w 2 stun.services.mozilla.com 3478 |
    dd bs=1 count=4 skip=28 2>/dev/null |
    hexdump -e '1/1 "%u."' |
    sed 's/\.$/\n/'

O eco define uma solicitação de STUN binária (0x0001 indica solicitação de ligação) com o comprimento 8 (0x0008) com o cookie 0xc00cee e alguns itens colados do wireshark. Somente os quatro bytes que representam o IP externo são retirados da resposta, limpos e impressos.

Funcionando, mas não recomendado para uso em produção :-)

PS Muitos servidores STUN estão disponíveis, pois é uma tecnologia central para SIP e WebRTC. O uso de um da Mozilla deve ser seguro em termos de privacidade, mas você também pode usar outro: lista de servidores STUN


+1 para a tecnologia mais nerd e mais adequada. A consulta http funciona, que é o que eu tenho usado a vida toda, mas eu gosto que realmente tenha havido algum pensamento colocado na pergunta. Eu não sabia disso. Obrigado!
Mike S

7

Eu tenho um serviço estúpido para isso por telnet. Algo assim:

telnet myip.gelma.net

Your IPv4: xxx.xxx.xxx.xxx
Your IPv6: ::ffff:xxxx:xxxx

Sinta-se livre para usá-lo.


5

Você pode ler uma página web usando apenas bash, sem curl, wget:

$ exec 3<> /dev/tcp/icanhazip.com/80 && # open connection
  echo 'GET /' >&3 &&                   # send http 0.9 request
  read -u 3 && echo $REPLY &&           # read response
  exec 3>&-                             # close fd

Isto combinado com checkip.amazonaws.comé o mais rápido para mim
Avindra Goolcharan

1
@AvindraGoolcharan tentar um pedido dns
jfs

2

Para aqueles de nós com acesso de login aos nossos roteadores, usar um script para perguntar ao roteador qual é o endereço IP da WAN é a maneira mais eficiente de determinar o endereço IP externo. Por exemplo, o seguinte script python imprime o IP externo do meu roteador Medialink MWN-WAPR300N:

import urllib, urllib2, cookielib
import re
from subprocess import check_output as co

cookie_jar = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_jar))
urllib2.install_opener(opener)

def get(url, values=None):
  data = None
  if values: data = urllib.urlencode(values)
  req = urllib2.Request(url, data)
  rsp = urllib2.urlopen(req)
  return rsp.read()

router = co(['ip', '-o', 'ro', 'list', '0.0.0.0/0']).split()[2]
url = "http://" + router

get(url+"/index.asp")
get(url+"/LoginCheck", dict(checkEn='0', Username='admin', Password='admin'))
page = get(url+"/system_status.asp")

for line in page.split("\n"):
  if line.startswith("wanIP = "):
    print line.split('"')[1]
    exit(1)

Observe que isso não é muito seguro (como é o caso das credenciais de texto sem formatação e do logon na maioria dos roteadores) e certamente não é portátil (precisa ser alterado para cada roteador). No entanto, é muito rápido e uma solução perfeitamente razoável em uma rede doméstica fisicamente segura.

Para personalizar o script para outro roteador, recomendo usar o complemento tamperdata no firefox para determinar quais solicitações HTTP devem ser feitas.


2
Você deve tentar obter o endereço IP do roteador gramaticalmente. Por exemplo router = subprocess.check_output(['ip', '-o', 'ro', 'list', '0.0.0.0/0']).split()[2].
Cristian Ciupitu

2

Estes obterão os IPs locais:

ifconfig

ou para saída mais curta:

ifconfig | grep inet

Além disso

ip addr show

e provavelmente:

hostname -I

Isso deve obter o IP externo

wget http://smart-ip.net/myip -O - -q ; echo

NB Se você não se importa em instalar curl, também:

curl http://smart-ip.net/myip

1
ifconfig | sed -nre '/^[^ ]+/{N;s/^([^ ]+).*addr: *([^ ]+).*/\1,\2/p}'irá imprimir as interfaces locais e correspondentes V4 IP do
Hannu

1
ifconfig | sed -nre '/^[^ ]+/{N;N;s/^([^ ]+).*addr: *([^ ]+).*addr: *([^ ]+).*/\1,\2,\3/p}'- IPs v4 e v6.
Hannu 27/06

2

Muitos roteadores domésticos podem ser consultados pelo UPnP:

curl "http://fritz.box:49000/igdupnp/control/WANIPConn1" -H "Content-Type: text/xml; charset="utf-8"" -H "SoapAction:urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress" -d "<?xml version='1.0' encoding='utf-8'?> <s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'> <s:Body> <u:GetExternalIPAddress xmlns:u='urn:schemas-upnp-org:service:WANIPConnection:1' /> </s:Body> </s:Envelope>" -s

Então, grep o endereço IP da resposta.

grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>'

2

Se você estiver usando DD-WRT , isso funcionará para mim:

curl -s 192.168.1.1 | grep "ipinfo" | awk -v FS="(IP: |</span)" '{print $2}'

ou

curl -s -u your_ddwrt_username:your_ddwrt_password http://192.168.1.1 | grep "ipinfo" | awk -v FS="(IP: |</span)" '{print $2}'
  • Onde 192.168.1.1 é o endereço IP da LAN do gateway / roteador do roteador DD-WRT.

  • O componente -s significa silencioso (ou seja, não mostra as informações de progresso da ondulação).

  • Ah, devo mencionar que uso o acima com "DD-WRT v24-sp2 (01/04/15) std" .

1

Se você instalou o lynx no tipo Ubuntu

lynx bot.whatismyipaddress.com

curl bot.whatismyipaddress.comfunciona também
Tomofumi 30/01

0

use ip!

ip addr show

procure o adaptador relevante (não loe geralmente eth0) e localize o endereço IP próximo inet.


2
A pergunta é sobre endereços IP não internos públicas
Lobo

0

Talvez eu esteja um pouco atrasado, mas o inxi pode fazer isso com bastante facilidade.

Instalar inxi

sudo apt install inxi

Em seguida, execute o seguinte comando

inxi -i

Exemplo com minhas informações bloqueadas usando a zopção de copiar e colar em sites como este:

~$ inxi -iz
Network:   Card: NVIDIA MCP77 Ethernet driver: forcedeth
           IF: eth0 state: up speed: 1000 Mbps duplex: full mac: <filter>
           WAN IP: <filter>
           IF: eth0 ip-v4: <filter> ip-v6-link: N/A

Onde diz que <filter>é onde o seu endereço WAN IP, IPv4, MAC, etc. aparecerá


-2

Basta emitir um traceroute para qualquer site ou serviço.

sudo traceroute -I google.com

A linha 2 sempre parece ser meu endereço IP público depois de passar pelo gateway do roteador.

user@user-PC ~ $ sudo traceroute -I google.com
traceroute to google.com (173.194.46.104), 30 hops max, 60 byte packets
 1  25.0.8.1 (25.0.8.1)  230.739 ms  231.416 ms  237.819 ms
 2  199.21.149.1 (199.21.149.1)  249.136 ms  250.754 ms  253.994 ms**

Então, faça um comando bash.

sudo traceroute -I google.com | awk -F '[ ]' '{ if ( $2 ="2" ) { print $5 } }'

E a saída ...

(199.21.149.1)

Eu não acho que confiar em scripts PHP e o tipo seja uma boa prática.


isso é interessante, embora muito lento e não buscar o meu ip externo, como este
rubo77

Esta resposta é imprecisa demais para ser útil. No meu ambiente corporativo, não recebo meu endereço IP. A única maneira de funcionar é se você entender como os roteadores e switches locais são criados e, mesmo assim, pode não estar na linha 2, dependendo do número de saltos locais pelos quais você passa. Não há como criar um algoritmo coerente com essa técnica, e existem muitas outras soluções aqui que são mais simples e fornecerão a resposta correta sempre.
Mike S

Embora possa funcionar em algumas configurações especiais, na verdade nunca vi meu IP externo em um traceroute. Geralmente, é o meu gateway (se não estiver atrás do NAT) ou o gateway do meu roteador, mas principalmente outro roteador mais distante.
mivk

alias ip = 'lynx --dump ipecho.net/plain '
phildobbin

-2

Um comando sem dependências, exceto 8.8.8.8, sendo um DNS do Google:

echo $(ip route get 8.8.8.8 | awk '{print $NF; exit}')

Isso informa apenas o endereço IP da sua interface de saída local.
guntbert

o comando mostra o endereço IP público se eu o executar em um servidor em nuvem. Não era essa a pergunta?
Rolf

Não, onde você vê "servidor em nuvem"?
guntbert
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.