Яка моя IP-адреса?


24

Я здивований, що це ще не постало перед викликом.

Виведіть IP-адресу машини, на якій ви працюєте. Вам потрібно вивести як локальні, так і зовнішні IP-адреси.

Локальна IP-адреса, тобто за типовим форматом 192.168.xx

Загальнодоступну IP-адресу можна перевірити за допомогою google https://www.google.co.uk/search?source=hp&q=whats+my+ip

Вихід може бути в будь-якому форматі. IPv4 або IPv6 або будь-яка комбінація кожного з них дозволена, однак вони повинні бути єдиним результатом. Код може бути повноцінною програмою або функцією.

правила застосовуються так, що найкоротший виграш коду.

Стандартні лазівки заборонені.

РЕДАКТУВАТИ : Відповідно до коментаря @Peter Taylor, у випадку, коли існує декілька типів будь-якого типу, ви можете вибрати або вивести перший, або стільки, скільки ви можете отримати доступ. Поки присутні хоча б одна місцева та одна громадськість.


3
Я думаю, що ця 0/1річ додає зайвого пуху до виклику.
Містер Xcoder

5
Це не визначено. Зокрема, він не чітко розглядає випадки, коли існує кілька локальних IP-адрес та / або декілька загальнодоступних IP-адрес. Крім того, немає надійного способу сказати, чи є у мене кілька загальнодоступних IP-адрес, і якщо так, то які вони.
Пітер Тейлор

5
Що робити, якщо у хоста немає жодної адреси RFC 1918? Схоже, на це немає надійної відповіді, за винятком машин, у яких є хоча б одна приватна мережа.
Toby Speight

4
... і навіть один мережевий інтерфейс може мати кілька IP-адрес.
Каз

14
Насправді я не бачу, як можна було б вирішити половину цього без отримання зовнішнього джерела , що є однією зі стандартних лазів, які ви прямо заборонили.
Восьминіг

Відповіді:


18

Bash + curl + iproute2 , 54 50 49 48 33 байт

ip r g 1|awk '$0=$7'
curl eth0.me

Дякуємо @DomHastings за те, що ми граємо на 1 байт!

Дякуємо @Sisyphus, що придумав коротшу URL-адресу!

Дякуємо @zeppelin за те, що ти граєш на 9 байт!


@DomHastings Ваші останні спроби гольфу повертають трохи сміття разом із ip-адресою, принаймні, на Ubuntu 16.04.3 LTS
Ferrybig

@Ferrybig Так, 1/0частина видає помилку STDERR, але вона за замовчуванням ігнорується, якщо ви отримуєте інший вихід, ip routeхоча це може бути просто версія, яку я працював на своїй машині. Сором!
Дом Гастінгс

Перший рядок друкує 1000для мене ... ip route get 1вихід: ptpb.pw/pixx
Majora320

Коли я запускаю цей код, я отримую такий вихід:RTNETLINK answers: Network is unreachable
kasperd

1
Ви також можете трохи оптимізувати свій вираз AWK:awk 'NR<2&&$0=$7'
zeppelin

9

Bash 37 31 27 байт

Це навіяно відповіддю з боку Брюса Forte . Ця відповідь працює лише з IPv4, а це означає, що він не працює для мене. Я переписав його у версію, яка (лише) працює з IPv6:

ip r g b::|awk '$0=$9" "$9'

Це тестується на Ubuntu 14.04.5, підключений через PPPoE, і оскільки IPv6 призначений для використання без будь-якого NAT, він видаватиме одну і ту ж IP-адресу двічі.

-6 байт завдяки дирижаблі , -2 байт завдяки Ferrybig , -2 байт завдяки Markasoftware .


На моєму Ubuntu 16.04.3 LTS мені довелося змінити, '{print$11,$11}'щоб '{print$9,$9}'команда працювала, ваша команда поверталася 1024 2 рази, ваша команда працює на моїй машині Ubuntu 16.04.2
Ferrybig

@Ferrybig Можливо, тоді залежить від конфігурації мережі. Я перевірив це в мережі, де адреси налаштовуються автоматично з реклами маршрутизатора.
kasperd

Для машин, де ip-адреса налаштована вручну (статична), ip routeне виводить proto raдеталь, ви можете використовувати це як функцію для подальшого гольфу на свою відповідь
Ferrybig

@Ferrybig На даний момент я розмірковую, чи зможу я знайти спосіб змусити його працювати в обох випадках без розміру. Btw. на моїй машині 16.04.3, яка отримала свою конфігурацію за допомогою реклами маршрутизатора, вона proto staticне говорить proto ra, хоча ця різниця не має значення для цього коду.
kasperd

Щоб трохи пограти в гольф, використовуйте awk '$0=$9" "$9'замість цього {print$11,$11}. У багатьох системах (у тому числі в моїй Arch Arch) використовується 9-е слово, тому воно коротше, ніж 11, а також використання цього синтаксису менше, ніж друк $ 9, $ 9
markasoftware

7

Математика, 17 байт

Математика має вбудований для всього

$MachineAddresses

Як описано в документації , ця вбудована команда перераховує всі IP-адреси (як локальні, так і зовнішні), пов'язані з вашим пристроєм.


Документація нічого не говорить про зовнішні адреси.
kasperd

Якщо ця команда також перераховує адресу ipv6, то ви можете сказати, що ipv6 адреса - очікуваний результат
Ferrybig

5
Це створює список декількох IP-адрес для мене, але жодна з них не здається моєю зовнішньою адресою; Я, можливо, не інтерпретую речі правильно. Я можу отримати свою зовнішню IP-адресу від чогось подібного, WolframAlpha["ip address", {{"IPAddress:InternetData", 1}, "ComputableData"}][[1,2]]але я не знаю, як це отримати безпосередньо.
Марк С.

@MarkS. Це дивно; Я отримую свою зовнішню IP-адресу, коли запускаю команду (здається, що це останній запис). Ця команда не працює на Wolfram Sandbox. Можливо, це помилка; яку версію ОС та Mathematica ви використовуєте?
JungHwan Min

@JungHwanMin 11.1.1.0 Студентське видання дає мені 6 речей, на які я вважаю, це IPv6, потім 192.168.0.104 та три адреси, починаючи з 169.254. Але моя зовнішня адреса починається з 69.
Марк С.

6

AutoIt, 56 53 байти

#include<Inet.au3>
ConsoleWrite(@IPAddress1&_GetIP())

@IPAddress1 це макрос, який повертається

IP-адреса першого мережного адаптера

_GetIP() повертає

публічна IP-адреса.


-3 байти завдяки @ mınxomaτ


3
Акуратний, товариш AutoIt (не ІТ) -er. Ви можете видалити пробіли в цьому коді.
mınxomaτ

@ mınxomaτ Дякую за виправлення :)
Даніель

6

C #, 196 194 188 163 байт

namespace System.Net.Sockets{using Linq;_=>Dns.GetHostEntry("").AddressList.First(i=>(int)i.AddressFamily==2)+" "+new WebClient().DownloadString("http://eth0.me")}

Збережено 2 байти завдяки @Xynos.
Збережено 25 байт завдяки @Nick.

Повна / відформатована версія:

namespace System.Net.Sockets
{
    using Linq;

    class P
    {
        static void Main()
        {
            Func<object, string> f = _ =>
                Dns.GetHostEntry(Dns.GetHostName())
                    .AddressList
                    .First(i => (int)i.AddressFamily == 2) + " " + new WebClient().DownloadString("http://eth0.me");

            Console.WriteLine(f(null));

            Console.ReadLine();
        }
    }
}

не можеш зберегти два байти, видаливши пробіл навколо ==?
MysticVagabond

@Xynos Звичайно, не зрозумів, що не видалив його.
TheLethalCoder

Версія для гольфу не збирається і не є окремою функцією. Не видається справедливим змішувати окрему функцію з ярликом використання простору імен Sockets, тому я б запропонував вибрати один варіант і перейти до нього. Тим НЕ менше, ви можете заощадити кілька байт лиття i.AddressFamilyна intзамість лиття 2в AddressFamily, і ви можете замінити Dns.GetHostName()на порожній рядку.
Нік

@Nick Я спробую це, коли отримаю шанс, і namespaceхитрість досить поширена для C #. Якщо ви думаєте, що це не повинно бути дозволено, ви можете розміщувати інформацію про мета, але на даний момент це чесна гра та акуратний трюк у скороченні usings.
TheLethalCoder

6

PowerShell v4 +, 40 36 байт

NetIPAddress|% IPA*
iwr eth0.me|% C*

(Працює лише на Server 2012 R2 або новішої версії, або Windows 8.1 або новішої версії. Не працює в TIO.)

Робить саме те, що написано на жерсті. Отримує IP-адреси локальної мережі та вибирає лише її IPAчастину ddress (наприклад, фільтрує маску підмережі, шлюз тощо).

Друга - це те, Invoke-WebRequestдо http://eth0.meчого просто набуває Cуваги; тобто просто публічна IP-адреса.


Негольована версія:

(Get-NetIPAddress).IPAddress
(Invoke-WebRequest eth0.me).content

Анонімний користувач пропонує видалитиGet-
Стівен

@StepHen Дійсно. Чудово працює.
AdmBorkBork

4

Unix Shell + вражаючий , 40 байт

stunclient stun.vo.lu|cut -d: -f2|sed 1d

Використовує a протокол STUN :

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

Ім'я сервера STUN походить від загального списку серверів STUN .

Формат виводу:

 LOCAL IPV4 ADDRESS
 PUBLIC IPV4 ADDRESS

Зауважте, що обидва рядки будуть з відступом одним пробілом, але я вважаю, що це не порушує правила виводу, як написано.

Вибірка зразка:

  192.168.1.100    
  209.85.233.147

4

завиток (bash one-liner): 27 байт

curl -w%{local_ip} eth0.me

Результат друкується stdoutі виглядає приблизно так:

1.2.3.4
192.168.0.10
# no trailing newline, use "curl -w%{local_ip}\\n eth0.me" for it

curl має бути принаймні версії 7.29.0 (з 6 лютого 2013 р.).

Відповідь ґрунтується на /codegolf//a/139538/66016 .


4

Перехід, лише для MacOS, 10 байт

У macOS цей killswitch можна використовувати, він може друкувати поточний приватний активний IP та загальнодоступний IP:

$ killswitch 
Interface  MAC address         IP
en1        bc:34:36:d2:81:ba   192.168.2.10

Public IP address: 179.43.176.99

No VPN interface found, verify VPN is connected

Це не вбудований інструмент, але намагається спростити процес пошуку власних IP-адрес.

Вихід можна отримати за допомогою таких команд:

$ route get 0.0.0.0

$ ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active'

$ networksetup -listnetworkserviceorder

$ scutil --dns

Публічний IP:

$ dig o-o.myaddr.l.google.com @ns.google.com txt +short

2
Привіт! Ласкаво просимо до PPCG! Це питання позначено кодом-гольф . Чи можете ви надати гольф-код з мовою та кількістю байтів?
Стівен

3

PowerShell v3 + (альтернативна відповідь для Windows 7+)

((ipconfig) -match "v4").split(":")[1]
Invoke-RestMethod eth0.me

2
Ласкаво просимо до PPCG!
Стівен

1
Ви можете видалити пробіли, -matchщоб зберегти пару байтів.
AdmBorkBork

3

Bash + Awk + Curl, 43 байти

використовуючи лише вбудовані інструменти для Mac та Linux

ifconfig|awk '/bro/{print $2}';curl eth0.me

1
* баш ти маєш на увазі.
Suici Doga

bash + awk + curl
Alex Nikiforov

я редагував питання, щоб сказати bash, оскільки він працює на моєму ноутбуці Linux, а не просто macos
Suici Doga

thx, я покращив, оскільки bash - це оболонка сама по собі (повинна працювати над tcsh, sh та будь-якою іншою оболонкою), вам також потрібно мати ifconfig, awk та curl
Alex Nikiforov

1
Це не "MacOS / Linux", це Bash. Просто позначте його як таке.
LyricLy

2

Python 3, 124 133 байт

from urllib2 import urlopen
import socket
a=urlopen('http://eth0.me').read()
b=socket.gethostbyname(socket.gethostname())
print a,b

Вам також не потрібно print a,b? Цікаво, що це робить два IP-адреси в моїй системі (Win7), але жоден з них не є моєю фактичною локальною IP-адресою. bнасправді IP-адреса віртуального адаптера, а не мій локальний зв'язок .
Восьминіг

Можливо, це все-таки локальна IP-адреса . Я залишив коментар до питання, щоб попросити роз'яснення з цього приводу.
Восьминіг

@Octopus Ви маєте рацію щодо друку, оновлено
Teo

У запропонованій редакції @David запропонував це: 113 байт ( огляд тут )
Стівен

2

Node.js (JavaScript) 224 223 194 175 173 130 байт

r=require,l=console.log,r('dns').lookup(r('os').hostname(),(a,b)=>l(b));r('http').get('http://eth0.me',a=>a.on('data',c=>l(c+"")))

Негольована версія:

require('dns').lookup(require('os').hostname(), (err, loc, fam) => console.log(loc));
require('http').get('http://eth0.me', res => {
    res.on('data', chunk => console.log(chunk + ""));
});

  • Збережено 1 байт (через непотрібну крапку з комою).
  • Збережено 29 байт завдяки @AndrewLi (використовувані функції зі стрілками для коротшого коду).
  • Збережено 19 байт завдяки @MiniGod (використовується .get()замість .request()- .end();видалено).
  • Збережено 2 байти завдяки @ Zacharý (круглі дужки не потрібні навколо одиночного параметра функції стрілки).
  • Збережено 43 байти завдяки @Birjolaxew (зберігається requireта console.logв однобуквенних змінних, передається URL безпосередньо до require('http').get, записується вихід безпосередньо з dataподії).

Не можете використовувати стрілочні функції для коротшого коду?
Ендрю Лі

@AndrewLi Чудова пропозиція, дякую. :)

Ви можете використовувати .get()замість .request(). Тоді вам також не потрібно .end();.
MiniGod

1
Вам не потрібні паролі навколо одиночного параметра функції стрілки. ( (a)=>=> a=>), IIRC.
Zacharý

1
@AndrewLi Хм, проблема полягає в тому, що коли запускається код у REPL, він друкує додаткову інформацію (наприклад, інформацію про запит), що заборонено у питанні. Я можу додати додатковий код, щоб приховати цей вихід, але це може протидіяти скороченню байтів, що є наслідком відмови від requireвикликів, тому я покину його. Дякуємо за пропозицію в будь-якому випадку.

1

Пакетний файл Windows , 116 байт

@for /f "tokens=1-2 delims=:" %%a in ('ipconfig^|find "v4"')do @echo%%b
@powershell -Command "(iwr eth0.me).content"

Перший рядок повторює результати запуску ipconfigта отримує вашу локальну IPv4 адресу.

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

Почнемо зі @знаку, щоб придушити повторюваний підказку ( C:\...\path>), потім запустимо команду Powershell Invoke-WebRequest(з її псевдонімом,iwr ) і витягуємо contentчастину цього.

Я експериментував з не використанням (...).contentі, натомість, лише запускаючи команду і витягуючи фактичну інформацію з повного виводу, використовуючи пакетний. Але це виявилося набагато довшим, ніж це рішення, тому я його дотримав.

Тестовано на Windows 10.0.15063.


1

R, 142 , 140 , 137 байт

library(magrittr);system("ipconfig",int=T)%>%regmatches(.,regexpr("v4.+",.))%>%{a=nchar(.);substr(.,a-14,a)};readLines("http://eth0.me")

Тестували на win10 та R (3.4.1).
Дякуємо за @ Bruce-Forte за коротку URL-адресу.

Негольована версія:

library(magrittr)
system("ipconfig",int=T) %>% 
     regmatches(.,regexpr("v4.+",.)) %>% 
      {a <- nchar(.)
       substr(., a - 14, a)}
readLines("http://eth0.me")


@BLT приємне рішення. Ви можете зберегти 3 байти, замінивши a <- nchar(x)наa=nchar(x)
AndriusZ

@AndruisZ дякую, але це справді ваше рішення - я просто де-magrittr'd це.
BLT


1

Bash + Curl, 24 байти

hostname -i;curl eth0.me

Це не працює. На сторінці man: " Цей параметр перераховує всі налаштовані адреси на всіх мережевих інтерфейсах. [...] Не робіть жодних припущень щодо порядку виводу."
ბიმო

Не має -I (капітал) іншого використання, ніж -i (малі). Біт, який ви цитували, був із розділу -I .
Напевно,

Правда, вибач за це. Але ще гірше сказано: " Уникайте використання цієї опції ", так чи інакше це не працює (принаймні, на моїх машинах) ..
ბიმო

Правда, правда, я не прочитав повну документацію перед публікацією. Як не дивно, здається, що він працює на деяких моїх машинах. Але ця невідповідність зробила б це рішення в кращому випадку ненадійним.
Напевно,

1

MS-SQL, 59 байт

SELECT TOP 1 local_net_address
FROM sys.dm_exec_connections

Повертає клієнтську IP-адресу екземпляра SQL, виконуючи запит.


0

VBA, 58 байт

Ну, не обробляє локальну адресу - виправлення виконується

Примітка. Використовує посилання на

Microsoft Internet Controls

Функція негайного вікна Anonymous VBE, яка не приймає даних і виводить IP-адресу користувача через вікно Internet Explorer

Set i=New InternetExplorer:i.Visible=1:i.Navigate"eth0.me"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.