我的IP地址是什么?


24

我很惊讶,这还没有解决。

输出您正在运行的计算机的IP地址。您需要同时输出本地和外部IP地址。

本地IP地址,即默认格式为192.168.xx

可以使用google https://www.google.co.uk/search?source=hp&q=whats+my+ip验证公用IP地址

输出可以是任何格式。允许使用IPv4或IPv6或它们的任意混合,但是它们必须是唯一的输出。代码可以是完整的程序或功能。

规则适用,因此最短的代码胜利。

禁止使用标准漏洞

编辑: 根据@Peter Taylor的评论,在存在两种类型的地址的情况下,您可以选择输出第一个地址,或输出尽可能多的地址。只要存在至少一个本地人和一个公众。


3
我认为这0/1增加了挑战的不必要的绒毛。
Xcoder先生17年

5
这是未指定的。特别是,它没有明确解决存在多个本地IP地址和/或多个公共IP地址的情况。此外,没有可靠的方法来告诉我是否有多个公共IP地址,如果有的话。
彼得·泰勒

5
如果主机没有任何RFC 1918地址怎么办?似乎没有可靠的答案,除了在具有至少一个专用网络的计算机上。
Toby Speight

4
...甚至一个网络接口也可以具有多个IP地址。
卡兹(Kaz)

14
实际上,我不知道如何在 从外部获取数据的情况解决其中的一半,这是您明确禁止的标准漏洞之一。
八达通

Answers:


18

击+ 卷曲 + iproute2的54个50 49 48 33字节

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

感谢@DomHastings打高尔夫球1个字节!

感谢@Sisyphus提供较短的URL!

感谢@zeppelin打9个字节!


@DomHastings上一次高尔夫尝试至少在Ubuntu 16.04.3 LTS上返回了一些垃圾以及IP地址
Ferrybig

@Ferrybig是的,该1/0部分向STDERR输出错误,但是默认情况下将忽略该错误,但是如果您获得不同的输出ip route,那可能只是我在计算机上运行的版本。耻辱!
Dom Hastings

第一行为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字节

这是由Bruce Forte答案所启发。该答案仅适用于IPv4,这意味着它不适用于我。我已经将其重写为(仅)与IPv6兼容的版本:

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

这在通过PPPoE连接的Ubuntu 14.04.5上进行了测试,并且由于IPv6被设计为不使用任何NAT的情况下使用,它将两次输出相同的IP地址。

-6个字节 齐柏林飞艇Ferrybig -2字节,Markasoftware -2字节。


在我的Ubuntu 16.04.3 LTS上,我必须进行更改'{print$11,$11}''{print$9,$9}'使该命令起作用,您的命令返回了1024次2次,您的命令在我的Ubuntu 16.04.2计算机上有效
Ferrybig

@Ferrybig然后可能取决于网络配置。我在从路由器通告自动配置地址的网络上对此进行了测试。
卡巴斯德(Kasperd)'17年

对于手动配置了IP地址(静态)ip route但不输出proto ra零件的机器,您可以将其用作进一步
了解

@Ferrybig目前,我正在思考是否可以找到一种在两种情况下都可以正常工作而又不会使尺寸膨胀的方法。顺便说一句。在我的16.04.3机器上,该机器使用路由器广告接收其配置,但它说proto static没有proto ra,尽管该区别与此代码无关。
卡巴斯德(Kasperd)'17年

要稍微打高尔夫球,请使用awk '$0=$9" "$9'代替{print$11,$11}。许多系统(包括我的Arch一号)都使用第9个字,因此它短于11个,并且使用此语法还比print $ 9,$ 9小
markasoftware

7

Mathematica,17个字节

Mathematica内置了所有功能

$MachineAddresses

如文档中所述,此内置命令列出了与设备关联的所有IP地址(本地和外部)。


该文档未提及任何有关外部地址的信息。
kasperd

如果此命令还列出了ipv6地址,则可以说ipv6地址是预期的结果
Ferrybig

5
这会为我生成几个IP地址的列表,但是似乎没有一个是我的外部地址。不过,我可能无法正确解释事物。我可以通过类似的方式获取我的外部IP地址,WolframAlpha["ip address", {{"IPAddress:InternetData", 1}, "ComputableData"}][[1,2]]但我不知道如何直接获取。
Mark S.

@分数。这很奇怪;我在运行命令时获得了外部IP地址(最后一个输入似乎是它)。但是,此命令在Wolfram Sandbox上不起作用。也许这是一个错误;您正在使用什么OS和Mathematica版本?
JungHwan Min

@JungHwanMin 11.1.1.0学生版为我提供了6种我认为是IPv6的东西,然后是192.168.0.104,以及三个以169.254开头的地址。但我的外部地址始于69
马克S.

6

AutoIt,56 53字节

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

@IPAddress1 是返回的宏

第一个网络适配器的IP地址

_GetIP() 退货

公用IP地址。


-3个字节,感谢@mınxomaτ


3
整洁,是AutoIt(不是IT)的同伴-er。您可以在此代码中删除空格。
mınxomaτ

@mınxomaτ感谢您的纠正:)
Daniel Daniel

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")}

@Xynos节省了2个字节。
@Nick节省了25个字节。

完整/格式化版本:

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.AddressFamilyint代替铸造2AddressFamily,并且可以更换Dns.GetHostName()用空字符串。
尼克

@Nick我将在有机会的情况下尝试使用该namespace技巧,这对于C#来说是相当普遍的。如果您认为不允许这样做,可以在它的meta上发布,但目前这是一个公平的游戏,并且是缩短usings 的巧妙方法。
TheLethalCoder

6

PowerShell v4 +,40个36字节

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

(仅适用于Server 2012 R2或更高版本,或Windows 8.1或更高版本。不适用于TIO。)

完全按照锡罐上的说明去做。获取本地网络IP地址并仅选择其IPA地址部分(例如,过滤出子网掩码,网关等)。

第二个是一个Invoke-WebRequesthttp://eth0.me它简单地获取C其ontent; 即只是公共IP地址。


非高尔夫版本:

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

一位匿名用户建议删除Get-
Stephen的“

@StepHen确实。效果很好。
AdmBorkBork

4

Unix Shell + stunclient,40个字节

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

利用STUN协议

NAT的会话遍历实用程序(STUN)是一种协议,可作为其他协议处理网络地址转换器(NAT)遍历的工具。端点可以使用它来确定NAT分配给它的IP地址和端口

STUN服务器名称来自Public STUN服务器列表

输出格式为:

 LOCAL IPV4 ADDRESS
 PUBLIC IPV4 ADDRESS

请注意,两行都将缩进一个空格,但是我相信这不会违反书面的输出规则。

样本输出:

  192.168.1.100    
  209.85.233.147


4

Go,仅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!这个问题被标记为code-golf。您能提供带有语言和字节数的高尔夫代码吗?
斯蒂芬

3

PowerShell v3 +(Windows 7+的替代答案)

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

2
欢迎来到PPCG!
斯蒂芬

1
您可以删除周围的空格-match以节省几个字节。
AdmBorkBork '17

3

Bash + Awk + ​​Curl,43个字节

仅使用Mac和Linux的内置工具

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

1
*重击你的意思。
Suici Doga

bash + awk + ​​curl
Alex Nikiforov

我编辑了说bash的问题,因为它不仅可以在
macOS

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吗?有趣的是,它的确在我的系统(Win7)上输出了两个IP,但是其中一个都不是我的实际本地IP地址。b实际上是虚拟适配器的IP,而不是我的本地连接
Octopus

但是可以说,这仍然是本地IP地址。我对问题发表了评论,要求对此进行澄清。
八达通

@Octopus您对打印是正确的,已更新
Teo

在一个建议的编辑中,@ David建议:113个字节在此处查看
Stephen

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个字节(由于不必要的分号)。
  • 使用@AndrewLi(使用箭头函数表示较短的代码),节省了29个字节
  • @MiniGod节省了19个字节(已使用,.get()而不是.request()- .end();已删除)。
  • @Zacharý节省了2个字节(不需要在箭头函数的单独参数周围加上括号)。
  • @Birjolaxew节省了43个字节(存储require并存储console.log在单字母变量中,将url直接传递到require('http').get,直接从data事件记录了输出)。

不能将箭头功能用于较短的代码吗?
李彦宏

@AndrewLi很棒的建议,谢谢。:)

您可以使用.get()代替.request()。然后,您也不需要.end();
MiniGod

1
您不需要箭头功能的单独参数周围的括号。((a)=>=> a=>),IIRC。
扎卡里

1
@AndrewLi Hmm,问题在于,当代码在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,142140,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")

最小120字节在线尝试!
BLT

@BLT不错的解决方案。您可以保存3个字节,方法是替换a <- nchar(x)a=nchar(x)
AndriusZ

@AndruisZ thanks, but it's really your solution -- I just de-magrittr'd it.
BLT

1

Python 2.7.13 128 bytes

print __import__("urllib").urlopen("http://eth0.me").read(),__import__("socket").gethostbyname(__import__("socket").getfqdn())

1

Bash + Curl, 24 bytes

hostname -i;curl eth0.me

This doesn't work.. From the man page: "This option enumerates all configured addresses on all network interfaces. [...] Do not make any assumptions about the order of the output."
ბიმო

-I(大写)具有比不同的使用-i(小写)。您引用的位来自-I部分。
大概

是的,对此表示抱歉。但更糟糕它说:“ 使用避免使用此选项 ”,无论哪种方式,这不(在我的机器至少)工作..
ბიმო

是的,诚然,我在发布之前没有阅读完整的文档。奇怪的是,它似乎可以在我的一些机器上正常工作。但是这种不一致将使该解决方案充其量是不可靠的。
大概

1

MS-SQL,59个字节

SELECT TOP 1 local_net_address
FROM sys.dm_exec_connections

返回执行查询的SQL实例的面向客户端的IP地址。


0

VBA,58字节

糟糕,无法处理本地地址-正在进行修复

注意: 使用参考

Microsoft Internet Controls

匿名VBE立即窗口功能,无需输入,即可通过Internet Explorer窗口输出用户的IP地址

Set i=New InternetExplorer:i.Visible=1:i.Navigate"eth0.me"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.