Какой у меня 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, в случае, когда присутствуют несколько адресов любого типа, вы можете выбрать либо вывод первого, либо столько, сколько вы можете получить. Пока присутствуют хотя бы один местный и один общественный.

MysticVagabond
источник
3
Я думаю, что 0/1это добавляет ненужного пуха к вызову.
Мистер Кскодер
5
Это не указано. В частности, в нем четко не рассматриваются случаи, когда существует несколько локальных IP-адресов и / или несколько общедоступных IP-адресов. Кроме того, нет надежного способа определить, есть ли у меня несколько общедоступных IP-адресов, и если да, то какие они есть.
Питер Тейлор
5
Что если хост не имеет адресов RFC 1918? Похоже, что нет надежного ответа на этот вопрос, за исключением компьютеров, которые имеют хотя бы одну частную сеть.
Тоби Спейт
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'
дирижабль
9

Баш 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 .

kasperd
источник
На моей Ubuntu 16.04.3 LTS, мне пришлось изменить , '{print$11,$11}'чтобы '{print$9,$9}'сделать командную работу, ваша команда возвратила 1024 2 раза, ваша команда работает на моей Ubuntu 16.04.2 машины
Ferrybig
@Ferrybig Вероятно, зависит от конфигурации сети. Я проверил это в сети, где адреса автоматически настраиваются из объявлений маршрутизатора.
Касперд
На машинах, где IP-адрес настроен вручную (статический), часть ip routeне выводится proto ra, вы можете использовать это как функцию, чтобы еще
глубже
@Ferrybig В данный момент я размышляю, смогу ли я найти способ заставить его работать в обоих случаях без увеличения размера. Btw. на моей машине 16.04.3, которая получила свою конфигурацию с помощью рекламы маршрутизатора, говорится , что proto staticнет proto ra, хотя это различие не имеет значения для этого кода.
Касперд
Чтобы немного поиграть в гольф, используйте awk '$0=$9" "$9'вместо {print$11,$11}. Многие системы (в том числе и моя Arch) используют 9-е слово, поэтому оно короче 11, и этот синтаксис меньше, чем print $ 9, $ 9
markasoftware
7

Mathematica, 17 байт

Mathematica имеет встроенный для всего

$MachineAddresses

Как описано в документации , эта встроенная команда перечисляет все IP-адреса (как локальные, так и внешние), связанные с вашим устройством.

Юнг Хван Мин
источник
В документации ничего не говорится о внешних адресах.
Касперд
Если в этой команде также указан адрес ipv6, то можно сказать, что адрес ipv6 является ожидаемым результатом
Ferrybig
5
Это дает мне список из нескольких IP-адресов, но ни один из них не является моим внешним адресом; Возможно, я не правильно интерпретирую вещи. Я могу получить свой внешний IP-адрес от чего-то вроде, WolframAlpha["ip address", {{"IPAddress:InternetData", 1}, "ComputableData"}][[1,2]]но я не знаю, как получить к этому более прямо.
Марк С.
@Метки. Это странно; Когда я запускаю команду, я получаю свой внешний IP-адрес (похоже, последняя запись). Однако эта команда не будет работать в Wolfram Sandbox. Возможно, это ошибка; какую версию ОС и Mathematica вы используете?
JungHwan Мин.
@JungHwanMin 11.1.1.0 Student Edition дает мне 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 (не IT) -ер. Вы можете удалить пробелы в этом коде.
mnxomaτ
@ mınxomaτ Спасибо за исправление :)
Даниэль
6

С # 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();
        }
    }
}
TheLethalCoder
источник
Вы не можете сохранить два байта, удалив пробелы вокруг ==?
MysticVagabond
@Xynos Конечно, не понимал, что я не удалил это.
TheLethalCoder
Версия для гольфа не компилируется и не является отдельной функцией. Кажется неуместным смешивать автономную функцию с ярлыком использования пространства имен Sockets, поэтому я бы предложил выбрать один вариант и использовать его. Тем не менее, вы можете сэкономить несколько байт литья i.AddressFamilyна intвместо литья 2в AddressFamily, и вы можете заменить Dns.GetHostName()на пустой строке.
Ник
@ Ник, я попробую это, когда у меня будет шанс, и этот namespaceприем довольно распространен для C #. Если вы думаете, что это не должно быть разрешено, вы можете опубликовать на мета об этом, но на данный момент это честная игра и хитрый трюк в сокращении usings.
TheLethalCoder
6

PowerShell v4 +, 40 36 байт

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

(Работает только на Server 2012 R2 или выше, или Windows 8.1 или выше. Не работает на TIO.)

Делает именно то, что говорит на жестяной банке. Получает IP-адреса локальной сети и выбирает только IPAих часть адреса (например, отфильтровывает маску подсети, шлюз и т. Д.).

Второе - это то, Invoke-WebRequestк http://eth0.meчему оно просто приходит C; т.е. просто публичный IP-адрес.


Безголовая версия:

(Get-NetIPAddress).IPAddress
(Invoke-WebRequest eth0.me).content
AdmBorkBork
источник
Анонимный пользователь предлагает удалитьGet-
Стивен
@ StepHen Действительно. Работает отлично.
AdmBorkBork
4

Unix Shell + stunclient , 40 байт

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

Использует протокол STUN :

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

Имя сервера STUN указано в списке серверов Public STUN .

Выходной формат:

 LOCAL IPV4 ADDRESS
 PUBLIC IPV4 ADDRESS

Обратите внимание, что обе строки будут иметь один пробел, но я считаю, что это не нарушает правила вывода, как написано.

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

  192.168.1.100    
  209.85.233.147
дирижабль
источник
4

curl (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

Go, только MacOS, 10 байт

В macOS можно использовать этот выключатель , который может печатать текущий частный активный 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
nbari
источник
2
Здравствуй! Добро пожаловать в PPCG! Этот вопрос помечен code-golf . Не могли бы вы предоставить гольф-код с языком и количеством байтов?
Стивен
3

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

((ipconfig) -match "v4").split(":")[1]
Invoke-RestMethod eth0.me
YChi Lu
источник
2
Добро пожаловать в PPCG!
Стивен
1
Вы можете удалить пробелы вокруг, -matchчтобы сохранить пару байтов.
AdmBorkBork
3

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

используя только встроенные инструменты для Mac и Linux

ifconfig|awk '/bro/{print $2}';curl eth0.me
Алекс Никифоров
источник
1
* ты имеешь в виду
Суичи Дога
bash + awk + curl
Алексей Никифоров
я отредактировал вопрос, чтобы сказать bash, так как он работает на моем ноутбуке linux, а не только на macos
Suici Doga
THX, я улучшил, так как bash является оболочкой как таковой (должен работать на tcsh, sh и любой другой оболочке), вам также нужно иметь ifconfig, awk и curl
Алекс Никифоров
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
Teo
источник
Тебе тоже не нужно print a,b? Интересно, что это выдает два IP-адреса в моей системе (Win7), но ни один из них не является моим действительным локальным IP-адресом. bна самом деле это IP-адрес виртуального адаптера, а не локальное подключение .
Осьминог
Возможно, хотя, это все еще локальный IP-адрес . Я оставил комментарий по Вопросу, чтобы попросить разъяснений по этому вопросу.
Осьминог
@ Осьминог, ты прав насчет печати, обновлено
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.
Захари
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-части, мне пришлось немного украсть изумительный ответ Powershell, потому что, насколько я знаю, нет способа получить публичный 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).
Спасибо за @ Брюс-Форте за короткий URL.

Безголовая версия:

library(magrittr)
system("ipconfig",int=T) %>% 
     regmatches(.,regexpr("v4.+",.)) %>% 
      {a <- nchar(.)
       substr(., a - 14, a)}
readLines("http://eth0.me")
AndriusZ
источник
@BLT хорошее решение. Вы можете сохранить 3 байта, заменив a <- nchar(x)наa=nchar(x)
AndriusZ
@AndruisZ спасибо, но это действительно твое решение - я просто размагничиваю его.
BLT
1

Python 2.7.13 128 байт

print __import__("urllib").urlopen("http://eth0.me").read(),__import__("socket").gethostbyname(__import__("socket").getfqdn())
Александр Бейн
источник
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, выполняющего запрос.

BradC
источник
0

VBA, 58 байт

Ой, не обрабатывает локальный адрес - исправление в процессе

Примечание: использует ссылку на

Microsoft Internet Controls

Функция анонимного непосредственного окна VBE, которая не вводит и выводит IP-адрес пользователя через окно Internet Explorer

Set i=New InternetExplorer:i.Visible=1:i.Navigate"eth0.me"
Тейлор Скотт
источник