Команда для определения моего публичного IP?

444

Если я зарегистрирую Google , я могу видеть свой публичный IP-адрес. Есть ли что-то в командной строке Ubuntu, которая даст мне тот же ответ?

    
задан kfmfe04 16.01.2012 в 12:50
источник

22 ответа

608

Если вы не находитесь за маршрутизатором, вы можете найти его, используя ifconfig .

Если вы находитесь за маршрутизатором, ваш компьютер не будет знать об общедоступном IP-адресе, поскольку маршрутизатор выполняет трансляцию сетевых адресов. Вы можете спросить какой-нибудь веб-сайт, что ваш публичный IP-адрес использует curl или wget , и извлечь из него необходимую информацию:

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

или короче

curl ipinfo.io/ip
    
ответ дан Michael K 16.01.2012 в 12:56
источник
344

Для поиска внешнего ip вы можете использовать внешние веб-сервисы или использовать системные методы. Легче использовать внешнюю службу, также решения на основе ifconfig будут работать в вашей системе, только если вы не отстаете от NAT . эти два метода подробно обсуждались ниже.

Поиск внешнего IP-адреса с использованием внешних служб

Самый простой способ - использовать внешнюю службу через браузер командной строки или инструмент загрузки. Поскольку wget доступно по умолчанию в Ubuntu, мы можем использовать это.
Чтобы найти ваш ip, используйте

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

Предоставлено

Вы также можете использовать lynx (браузер) или curl вместо wget с незначительными вариациями указанной выше команды, чтобы найти внешний ip.

Используя curl , чтобы найти ip:

$ curl ipecho.net/plain

Для лучшего форматированного вывода используйте:

$ curl ipecho.net/plain ; echo

Более быстрый (возможно самый быстрый) метод с использованием dig с OpenDNS как resolver:

  

Другие ответы здесь все передают HTTP на удаленный сервер. Некоторые из   они требуют разбора вывода или полагаются на заголовок User-Agent   чтобы сервер отвечал простым текстом. Они также весьма   часто (спуститесь, измените свое имя, разместите рекламу, можете изменить   выходной формат и т. д.).

     
  1. Протокол ответа DNS стандартизирован (формат будет оставаться совместимым).
  2.   
  3. Исторически службы DNS (OpenDNS, Google Public DNS, ..) имеют тенденцию выживать намного дольше и более стабильны, масштабируемы и обычно выглядят   после того, как любой новый hip whatismyip.com HTTP-сервис сегодня горячий.
  4.   
  5. (для тех выродков, которые заботятся о микро-оптимизации), этот метод должен быть по своей природе быстрее (будь то всего несколько микросекунд).
  6.   

Использование dig с помощью OpenDNS в качестве преобразователя:

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

111.222.333.444

Скопировано из: Ссылка

Поиск внешнего IP-адреса без использования внешних служб

  • Если вы знаете имя своего сетевого интерфейса

Введите в терминале следующее:

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

В приведенном выше примере замените <interface_name> именем вашего фактического интерфейса, например: eth0 , eth1 , pp0 и т. д.

Пример использования

$ LANG=c ifconfig ppp0 | grep "inet addr" | awk -F: '{print }' | awk '{print }'
111.222.333.444
  • Если вы не знаете имя своего сетевого интерфейса

Введите в терминале следующее: это имя и IP-адрес каждого сетевого интерфейса в вашей системе:

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

Пример использования

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

N.B: Выводы являются индикативными и не реальными.

Предоставлено: Ссылка

ОБНОВЛЕНИЕ

  1. LANG=c добавлено к использованию ifconfig , поэтому он всегда дает выход на английском языке, независимо от настройки локали.
ответ дан saji89 01.06.2012 в 14:10
96

Мой любимый всегда был:

curl ifconfig.me

простой, простой в использовании.

Вам нужно будет сначала установить curl;)

Если ifconfig.me не работает, попробуйте icanhazip.com или или ipecho.net

curl icanhazip.com

или

curl ipecho.net
    
ответ дан Panther 01.06.2012 в 14:41
53

icanhazip.com - мой любимый.

curl icanhazip.com

Вы можете запросить IPv4 явно:

curl ipv4.icanhazip.com

Если у вас нет curl , вы можете вместо этого использовать wget :

wget -qO- icanhazip.com
    
ответ дан yprez 01.06.2012 в 19:23
39

Я нашел все, что было раздражающим и медленным, поэтому я написал свой собственный. Это просто и быстро.

Его API находится на Ссылка

Примеры:

curl ident.me
curl v4.ident.me
curl v6.ident.me
    
ответ дан Pierre Carrier 03.01.2013 в 16:49
30

Вы можете использовать запрос DNS вместо HTTP-запроса, чтобы узнать свой публичный IP-адрес:

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

Он использует resolver1.opendns.com dns server для разрешения магического myip.opendns.com hostname на ваш IP-адрес.

    
ответ дан jfs 27.02.2014 в 16:07
17

Тот, который я использую, это:

wget -O - -q icanhazip.com

Да, у вас может быть ip: -)

    
ответ дан jflaflamme 16.01.2012 в 15:20
14

Amazon AWS

curl http://checkip.amazonaws.com

Пример вывода:

123.123.123.123

Мне нравится, потому что:

  • он возвращает только IP-адрес открытого текста, ничего больше
  • это от известного поставщика, который вряд ли скоро отправится в автономный режим.
ответ дан Ciro Santilli 包子露宪 六四事件 法轮功 21.12.2015 в 23:06
10

Введите именно это, нажмите Enter , где указано:

telnet ipecho.net 80 Введите
GET /plain HTTP/1.1 Введите
HOST: ipecho.net Введите
BROWSER: web-kit Enter
Enter

Это вручную отправляет HTTP-запрос, который вернет ваш IP-адрес в нижней части HTTP/1.1 200 OK reply

Пример вывода:

$ 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
    
ответ дан Liam 02.07.2013 в 08:38
7

Еще один быстрый (может быть, самый быстрый, относительно)

curl ipecho.net/plain
    
ответ дан Mohnish 31.12.2013 в 21:49
6

У меня есть глупое обслуживание для этого по telnet. Что-то вроде этого:

telnet myip.gelma.net

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

Не стесняйтесь использовать его.

    
ответ дан Gelma 13.03.2014 в 13:37
6

Для этого был изобретен STUN . В качестве клиента вы можете отправить запрос на общедоступный STUN-сервер и вернуть ему IP-адрес, который он видит. Относительно низкого уровня whatismyip.com, поскольку он не использует HTTP и не имеет искусно обработанных DNS-серверов, но невероятно быстрый протокол STUN.

Использование stunclient

Если у вас установлено stunclient ( apt-get install stuntman-client на debian / ubuntu), вы можете просто:

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

где A.B.C.D - это IP-адрес вашего компьютера в локальной сети, а W.X.Y.Z - серверы IP-адресов, такие как веб-сайты, которые видны снаружи (и тот, который вы ищете). Используя sed , вы можете уменьшить вывод выше до только IP-адреса:

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

Однако ваш вопрос заключался в том, как найти его с помощью командной строки, что может исключить использование STUN-клиента. Поэтому мне интересно ...

Использование bash

Запрос STUN может быть обработан вручную, отправлен на внешний сервер STUN с использованием netcat и после обработки обрабатывается с использованием dd , hexdump и sed , например:

$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/'

Echo определяет бинарный запрос STUN (0x0001 указывает запрос привязки), имеющий длину 8 (0x0008) с файлом cookie 0xc00cee и некоторый вложенный материал из wirehark. Только четыре байта, представляющие внешний IP, берутся из ответа, очищаются и печатаются.

Работа, но не рекомендуется для использования в производстве: -)

P.S. Многие STUN-серверы доступны, поскольку это основная технология для SIP и WebRTC. Использование одного из Mozilla должно быть безопасным для конфиденциальности, но вы также можете использовать другое: Список серверов STUN

    
ответ дан Victor Klos 09.10.2015 в 19:21
4

Вы можете прочитать веб-страницу, используя только bash, без 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
    
ответ дан jfs 18.09.2014 в 12:47
2

Используйте cURL с ipogre.com (поддерживаются IPv4 и IPv6).

IPv4

curl ipv4.ipogre.com

IPv6

curl ipv6.ipogre.com

Ссылка

    
ответ дан Jacob 31.12.2013 в 06:07
2

Для тех из нас, кто имеет доступ к входам в наши маршрутизаторы, используя сценарий, чтобы спросить маршрутизатора, что его «WAN IP-адрес» является наиболее эффективным способом определения внешнего IP-адреса. Например, следующий скрипт python выводит внешний IP-адрес моего маршрутизатора 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)

Обратите внимание, что это не очень безопасно (как в случае с учетными данными открытого текста и входа в систему для большинства маршрутизаторов), и, конечно же, не переносимо (необходимо изменить для каждого маршрутизатора). Это, однако, очень быстро и вполне разумное решение в физически защищенной домашней сети.

Чтобы настроить сценарий для другого маршрутизатора, я рекомендую использовать аддон tamperdata в firefox, чтобы определить, какие HTTP-запросы нужно сделать.

    
ответ дан KarlC 27.03.2014 в 04:08
2

Они получат локальные IP-адреса:

ifconfig

или для более короткого вывода:

ifconfig | grep inet

и

ip addr show

и, возможно:

hostname -I

Это должно получить внешний IP

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

N.B. Если вы не против установки curl , это также:

curl http://smart-ip.net/myip
    
ответ дан Wilf 27.06.2014 в 18:08
1

Если вы установили lynx в тип Ubuntu

lynx bot.whatismyipaddress.com
    
ответ дан Binny 09.01.2013 в 13:35
1

Многие домашние маршрутизаторы могут запрашивать 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

Затем, grep ip-адрес из ответа.

grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>'
    
ответ дан jms 18.09.2016 в 22:45
0

используйте ip !

ip addr show

затем найдите соответствующий адаптер (не lo и обычно eth0 ) и найдите ip-адрес около inet .

    
ответ дан Eliran Malka 16.08.2016 в 01:06
0

Если вы используете DD-WRT , то это работает для меня:

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

или

curl -s -u your_ddwrt_username:your_ddwrt_password http://192.168.1.1 | grep "ipinfo" | awk -v FS="(IP: |</span)" '{print }'
  • Где 192.168.1.1 является IP-адресом шлюза / маршрутизатора LAN маршрутизатора DD-WRT.

  • Компонент -s означает молчание (т. е. не отображает информацию о текучести закрутки).

  • О, я должен упомянуть, что я использовал выше с "DD-WRT v24-sp2 (01/04/15) std" .
ответ дан CMP 14.04.2017 в 18:14
-1

Команда без зависимостей, за исключением того, что 8.8.8.8 является GOogle DNS:

echo $(ip route get 8.8.8.8 | awk '{print $NF; exit}')
    
ответ дан Rolf 19.08.2015 в 09:57
-2

Просто выпустите traceroute для любого веб-сайта или службы.

sudo traceroute -I google.com

Строка 2 всегда кажется моим общедоступным IP-адресом после того, как она пройдет через мой маршрутизатор.

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**

Итак, сделайте команду bash.

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

И выход ...

(199.21.149.1)

Я не думаю, что полагаюсь на PHP-скрипты, и сортировка - хорошая практика.

    
ответ дан woahguy 24.07.2015 в 18:34