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


637

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


2
«имеющий динамический IP», «SSH, использующий какую-то другую систему через Интернет», «команда, которая будет отображать текущий ОБЩЕСТВЕННЫЙ IP». Вы видите проблему курицы / яйца здесь? Как вы сможете запускать команды на удаленном сервере, не зная его адреса? Возможно, вас больше заинтересуют такие сервисы, как no-ip.com / DynDNS.org.
gertvdijk

Нельзя SSH, не зная общедоступного IP-адреса, мой друг ... DynDNS стоит дорого, но не-ip - тяжелая работа, но ситуация не позволяет этого ... в любом случае, на этот вопрос уже дан ответ ... спасибо за ваше предложение
Бхавеш Диван

1
PS duckduckgo.com/?q=ip (без командной строки, но и без старшего брата G)
Campa

1
Возможно, это должен быть отдельный вопрос, но я хотел бы видеть предупреждение, когда мой публичный IP-адрес изменится. Пока я просто использую следующие ответы в crontab с notify-send.
PJ Brunet

отличные решения ниже. Для использования Centos: ifconfig eth1 | sed -nre '/^[^ ]+/{N;s/^([^ ]+).*inet *([^ ]+).*/\2/p}'где eth1 - интересующее сетевое устройство, вы можете опустить строку 'et1', чтобы показать все ips всех адаптеров. Вместо этого \2вы можете написать, \1 \2чтобы показать имена каждого адаптера тоже.
Hafenkranich

Ответы:


916

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

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

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

или короче

curl https://ipinfo.io/ip

27
Ты - сразу после публикации я понял, что не гуглю сначала ответ: похоже, это будет работать curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//' Другие возможности перечислены здесь: go2linux.org/what-is-my-public-ip-address-with-linux
kfmfe04

1
конечно - вы можете добавить его к своему ответу
kfmfe04

1
Чтобы уточнить: это был взлом, и очень уродливый, поэтому я сделал правку, чтобы сделать ее проще и понятнее для людей.
Jrg

2
Точно так, как сказал Джованни П. ОП должен изменить принятый ответ.
Лоустро

36
curl -s ipinfo.io/ip
chao

384

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

Нахождение внешнего IP с использованием внешних сервисов

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

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

Вежливость :

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

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

$ curl https://ipecho.net/plain

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

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

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

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

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

Используя dig с OpenDNS в качестве резольвера:

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

111.222.333.444

Скопировано из: https://unix.stackexchange.com/a/81699/14497

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

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

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

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

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

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

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

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

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

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

$ 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

NB: выходы являются ориентировочными, а не реальными.

Предоставлено: https://www.if-not-true-then-false.com/2010/linux-get-ip-address/

ОБНОВИТЬ

  1. LANG=cбыл добавлен к ifconfigосновному использованию, так что он всегда дает вывод на английском языке, независимо от настроек локали.

1
@ Z9iT, конечно .. Это должно работать в любом дистрибутиве Linux, если у вас установлен wget. Как уже говорилось, если у вас уже есть локон или рысь, пожалуйста, используйте его. Вам понадобится разрешение root для установки, так что используйтеsudo apt-get install wget
saji89

13
Команды с ifconfig работают, только если вы не находитесь за NAT.
lukassteiner

1
просто используйте -wопцию curl вместо echo :)curl -w '\n' ident.me
drAlberT

3
Это предложение с использованием dig довольно неплохое unix.stackexchange.com/questions/22615/…
binaryanomaly

4
Последняя версия без внешних служб работает только в том случае, если ваш компьютер подключен напрямую к Интернету, что бывает редко, в противном случае вы получаете только свой локальный IP-адрес.
rubo77

117

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

curl ifconfig.me

просто, легко набрать.

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

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

curl icanhazip.com

или же

curl ipecho.net

3
@ Z9iT, я только что проверил это сейчас. Да, это будет выводить внешний IP в вашем терминале.
saji89

7
Время отклика от ifconfig.meкажется немного медленнее, чем ipecho.net.
Дрю Ноакс

3
Если у вас нет, curlно есть wget:wget -U curl -qO- ifconfig.me
Стефан Шазелас

2
ifconfig.me, похоже, не отвечает :(
Asfand Qazi

1
@AsfandYarQazi - здесь работает. Вы можете попробовать один из альтернатив, icanhazip.com
Panther

59

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

curl icanhazip.com

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

curl ipv4.icanhazip.com

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

wget -qO- icanhazip.com

Спасибо! Мне приходилось пробовать многие из предложенных выше, пока я не нашел кое-что, поддерживающее IPv6. Обидно, что такие сервисы обычно все еще только для IPv4.
Владимир Чунат

48

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

Его API находится на http://api.ident.me/

Примеры:

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

1
Вау, это было действительно быстро!
Валдириус

1
Я нахожу решение icanhazip.com быстрее, и оно включает новую строку в вывод.
Тайлер Кольер

1
Да, это было действительно быстрее в последнее время. Просто подправил мое решение.
Пьер Кэрриер

2
Престижность! 2 года, и вы все еще поддерживаете его. Отлично сработано. «ИДЕНТИФИКАЦИЯ МЕНЯ» - вот что мне приходит в голову, когда мне нужно проверить ip :)
Mohnish

aws быстрее time curl http://checkip.amazonaws.com-> 0.91svs .241sfor ident.meДавайте просто помолимся, aws не сработает;)
Avindra Goolcharan

42

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

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

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


3
Это действительно быстро. Я выполнил один разминочный прогон, затем по 10 расстрелов каждый из них и curl icanhazip.com. Среднее по curlверсии: 174мс. Среднее значение для DNS-версии: 9 мс. ~ В 19 раз быстрее См. Также: unix.stackexchange.com/a/81699/8383
Адам Монсен

1
@AdamMonsen Спасибо за ссылку. Смысл использования DNS (как говорит ответ, который вы связали) заключается в том, что ответ является стандартным (и вряд ли изменится), и служба (OpenDNS) может оставаться дольше, чем большинство его альтернатив http. Время, необходимое для выполнения запроса, может зависеть от времени запуска команды.
Jfs

Ага. Я не удивлюсь, если curlсам медленнее, чем dig. Даже если бы они были переписаны так, чтобы быть как можно более похожими, curlони все равно были бы медленнее; он использует HTTP ( включая DNS) и digиспользует только DNS.
Адам Монсен

22

Amazon AWS

curl http://checkip.amazonaws.com

Образец вывода:

123.123.123.123

Я люблю его, потому что:

  • он возвращает только открытый текстовый IP, больше ничего
  • от известного провайдера, который вряд ли скоро отключится

18

Я использую:

wget -O - -q icanhazip.com

Да, вы можете иметь IP :-)


3
Я предпочитаю, что curl icanhazip.comиногда wgetэто единственный доступный, но иногда нет wgetи доступен, и curlэто ваш единственный вариант (например, OS / X). В любом случае curl icanhazip.comэто почти так же просто, как и curl ifconfig.me
смешно

11

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

telnet ipecho.net 80Enter
GET /plain HTTP/1.1Enter
HOST: ipecho.net Enter
BROWSER: web-kitEnter
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

6
Хорошо, это работало хорошо, отсутствие необходимости устанавливать curl было для меня преимуществом: один вкладыш: printf "GET / plain HTTP / 1.1 \ nHOST: ipecho.net \ nBROWSER: web-kit \ n \ n" | nc ipecho.net 80
Озон

9

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

curl ipecho.net/plain

9

Для этого был изобретен 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: \(.*\):.*$/\1/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/'

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

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

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


+1 за самую отвратительную и действительно самую подходящую технологию. Http-запрос работает, и это то, чем я пользуюсь всю свою жизнь, но мне нравится, что на самом деле в этот вопрос были внесены некоторые мысли. Я этого не знал. Спасибо!
Майк С

7

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

telnet myip.gelma.net

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

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


5

Вы можете прочитать веб - страницы , используя только Баш, без 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

Это в сочетании с checkip.amazonaws.comявляется самым быстрым для меня
Avindra Goolcharan

1
@AvindraGoolcharan попробовать запрос DNS
JFS

2

Для тех из нас, у кого есть доступ к нашим маршрутизаторам при входе в систему, использование сценария для запроса маршрутизатора о его 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-запросы делать.


2
Вы должны попытаться получить IP-адрес маршрутизатора грамматически. Например router = subprocess.check_output(['ip', '-o', 'ro', 'list', '0.0.0.0/0']).split()[2].
Кристиан Чиупиту

2

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

ifconfig

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

ifconfig | grep inet

также

ip addr show

и, вероятно,

hostname -I

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

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

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

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

1
ifconfig | sed -nre '/^[^ ]+/{N;s/^([^ ]+).*addr: *([^ ]+).*/\1,\2/p}'распечатает локальные интерфейсы и соответствующие IP-адреса V4
Hannu

1
ifconfig | sed -nre '/^[^ ]+/{N;N;s/^([^ ]+).*addr: *([^ ]+).*addr: *([^ ]+).*/\1,\2,\3/p}'- IP версии 4 и 6.
Ханну

2

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

Затем извлеките IP-адрес из ответа.

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

2

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

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

или же

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

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

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


0

использовать ip!

ip addr show

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


2
Вопрос о публичных, а не внутренних IP-адресах
Wolf

0

Может быть, я немного опоздал, но Инси может сделать это довольно легко.

устанавливать inxi

sudo apt install inxi

Затем выполните следующую команду

inxi -i

Пример с моей информацией, заблокированной с помощью zопции для копирования и вставки на сайты, подобные этому:

~$ 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

Где написано <filter>, где появится ваш WAN IP, IPv4, MAC-адрес и т. Д.


-2

Просто создайте трассировку для любого веб-сайта или услуги.

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 ="2" ) { print $5 } }'

И вывод ...

(199.21.149.1)

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


это интересно, хотя и очень медленно и не получает мой внешний ip вот так
rubo77

Этот ответ слишком неточный, чтобы быть полезным. В моей корпоративной среде я вообще не получаю свой IP-адрес. Единственный способ, которым это работает, - это если вы понимаете, как создаются ваши локальные маршрутизаторы и коммутаторы, и даже в этом случае он может быть не на линии 2, в зависимости от количества локальных прыжков, которые вы перепрыгнули. Невозможно сделать из этого метода согласованный алгоритм, и здесь есть много других решений, которые проще и каждый раз дают правильный ответ.
Майк С

Хотя это может работать в некоторых специальных конфигурациях, я фактически никогда не видел свой внешний IP в traceroute. Обычно это либо мой шлюз (если я не нахожусь за NAT), либо шлюз моего маршрутизатора, но в основном это какой-то другой маршрутизатор, расположенный дальше.
mivk

псевдоним ip = 'lynx --dump ipecho.net/plain '
phildobbin

-2

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

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

Это только говорит вам IP-адрес вашего локального исходящего интерфейса.
Гюнтберт

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

Нет, где вы видите «облачный сервер»?
Гюнтберт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.