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


636

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


2
"має динамічний IP", "SSH, використовуючи якусь іншу систему через Інтернет", "команда, яка відображатиме поточний ПУБЛІЧНИЙ IP". Ви бачите тут проблему з куркою / яйцями? Як би ви могли запускати команди на віддаленому сервері, не знаючи його адреси? Можливо, вас зацікавлять такі сервіси, як no-ip.com / DynDNS.org.
gertvdijk

ніхто не може SSH, не знаючи публічного IP мій друг ... dynDNS коштує чимало і не працює, але ситуація не дозволяє цього ... все одно на питання вже відповіли .. дякую за вашу пропозицію
Bhavesh Diwan

1
PS duckduckgo.com/?q=ip (командного рядка немає, але немає і старшого брата G)
Кампанія

1
Можливо, це має бути окремим питанням, але я хотів би отримати попередження, коли моя публічна IP-адреса зміниться. Поки що я просто використовую наступні відповіді в crontab с notify-send.
PJ Brunet

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

Відповіді:


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
ty - одразу після публікації я зрозумів, що спочатку я не гугл для відповіді: схоже, що це спрацює. 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
Так, як заявив Джованні П. ОП має змінити прийнятий ревізор.
loostro

36
curl -s ipinfo.io/ip
chao

385

Для пошуку зовнішнього ip можна використовувати зовнішні веб-сервіси або використовувати системні методи. Простішим є використання зовнішньої служби, а також ifconfigзасновані рішення працюватимуть у вашій системі лише у тому випадку, якщо ви не відстаєте від NAT. ці два методи були детально розглянуті нижче.

Пошук зовнішнього ІР за допомогою зовнішніх служб

Найпростіший спосіб - це використання зовнішньої служби через браузер командного рядка або інструмент завантаження. Оскільки 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, ..), як правило, виживають набагато довше і є більш стабільними, масштабованими та зазвичай доглядають, ніж будь-який новий сервіс HTTP HTTP whatismyip.com сьогодні гарячий.
  3. (для тих вун, які піклуються про мікрооптимізацію) цей метод повинен бути по суті швидшим (будь то лише декілька мікросекунд).

Використання копання з 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

Примітка: Результати є орієнтовними та не реальними.

Люб’язно: https://www.if-not-true-then-false.com/2010/linux-get-ip-address/

ОНОВЛЕННЯ

  1. LANG=cбуло додано до ifconfigбазових звичаїв, так що він завжди дає вихід з англійської мови, незалежно від налаштування мови.

1
@ Z9iT, звичайно. Він повинен працювати в будь-якому дистрибутиві Linux за умови встановлення wget. Як сказано, якщо у вас вже є завитки або рись, будь ласка, використовуйте це замість цього. Вам знадобиться кореневий дозвіл, щоб встановити це використання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
Stéphane Chazelas

2
ifconfig.me, схоже, не відповідає :(
Asfand Qazi

1
@AsfandYarQazi - працює тут. Ви можете спробувати одного з заступників, icanhazip.com
Пантера

60

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
Вау, це було дійсно швидко!
waldyrious

1
Я швидше знаходжу рішення icanhazip.com, і воно включає новий рядок у висновку.
Тайлер Колліер

1
Так, останнім часом це було дійсно швидше. Просто налаштував моє рішення.
П’єр Перевізник

2
Кудо! 2 роки, і ви все ще підтримуєте це. Молодці. "Ідентифікуйте мене" - це те, що мені спадає на думку, коли мені потрібно перевірити ip :)
Mohnish,

AWS швидше time curl http://checkip.amazonaws.com-> 0.91sпроти .241sдля 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але набагато смішніше ;-)
TryTryAgain

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 та дати йому 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 працює, чим я користувався все своє життя, але мені подобається, що насправді була якась думка, поставлена ​​під питанням. Я цього не знав. Дякую!
Майк S

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найшвидшим для мене
Авіндра Голчаран

1
@AvindraGoolcharan спробуйте запит dns
jfs

2

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

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

Щоб налаштувати скрипт для іншого маршрутизатора, я рекомендую використовувати аддон тампердату у 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

Примітка. Якщо ви не заперечуєте встановлення 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}'- IP4 v4 та v6.
Ханну

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.2015) std" .


0

використання ip!

ip addr show

потім знайдіть відповідний адаптер (не lo, а зазвичай eth0) та знайдіть ip-адресу поблизу inet.


2
Питання стосується публічних, а не внутрішніх IP-адрес
Wolf

0

Можливо, я трохи запізнююся, але inxi це зробити досить легко.

Встановити 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

Просто опублікуйте 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 ="2" ) { print $5 } }'

І вихід ...

(199.21.149.1)

Я не думаю, що покладатися на PHP-скрипти і подібне є доброю практикою.


це цікаво, хоча насправді повільно і не отримує мого зовнішнього ip, як це
rubo77

Ця відповідь занадто неточна, щоб бути корисною. У своєму корпоративному середовищі я взагалі не отримую свою IP-адресу. Єдиний спосіб це - якщо ви розумієте, як створюються ваші локальні маршрутизатори та комутатори, і навіть тоді це може бути не на лінії 2, залежно від кількості місцевих стрибків, через які ви переходите. Немає способу скласти цілісний алгоритм з цієї методики, і тут є безліч інших рішень, які є простішими і щоразу отримуватимуть належну відповідь.
Майк S

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

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

-2

Команда без залежностей, окрім 8.8.8.8, є DNS-кодом GOogle:

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

Це говорить лише про IP-адресу вашого локального вихідного інтерфейсу.
guntbert

команда показує загальнодоступну ip адресу, якщо я запускаю її на хмарному сервері. хіба це питання?
Рольф

Ні, де ви бачите "хмарний сервер"?
guntbert
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.