Địa chỉ IP của tôi là gì?


24

Tôi ngạc nhiên khi điều này chưa đến trong một thử thách nào.

Xuất địa chỉ IP của máy bạn đang chạy. Bạn được yêu cầu xuất cả địa chỉ IP cục bộ và bên ngoài.

Địa chỉ IP cục bộ, tức là dọc theo định dạng mặc định 192.168.xx

Địa chỉ IP công cộng có thể được xác minh bằng cách sử dụng google https://www.google.co.uk/search?source=hp&q=whats+my+ip

Đầu ra có thể ở bất kỳ định dạng. IPv4 hoặc IPv6 hoặc bất kỳ kết hợp nào của từng được cho phép, tuy nhiên chúng phải là đầu ra duy nhất. Mã có thể là một chương trình đầy đủ hoặc một chức năng.

quy tắc áp dụng để chiến thắng mã ngắn nhất.

Lỗ hổng tiêu chuẩn bị cấm.

EDIT: Theo nhận xét của @Peter Taylor, trong trường hợp có nhiều loại địa chỉ, bạn có thể chọn xuất địa chỉ đầu tiên hoặc nhiều nhất có thể truy cập. Miễn là có ít nhất một địa phương và một công chúng có mặt.


3
Tôi nghĩ rằng 0/1điều này thêm vào lông tơ không cần thiết cho các thách thức.
Ông Xcoder

5
Điều này là không xác định. Cụ thể, nó không giải quyết rõ ràng các trường hợp có nhiều địa chỉ IP cục bộ và / hoặc nhiều địa chỉ IP công cộng. Hơn nữa, không có cách nào đáng tin cậy để biết liệu tôi có nhiều địa chỉ IP công cộng hay không và nếu có thì chúng là gì.
Peter Taylor

5
Điều gì xảy ra nếu máy chủ không có bất kỳ địa chỉ RFC 1918 nào? Có vẻ như không có câu trả lời đáng tin cậy nào cho vấn đề này, ngoại trừ trên các máy có ít nhất một mạng riêng.
Toby Speight

4
... và thậm chí một giao diện mạng có thể có nhiều địa chỉ IP.
Kaz

14
Trên thực tế, tôi không thấy làm thế nào bạn có thể giải quyết một nửa điều này mà không cần tìm nạp từ nguồn bên ngoài , đây là một trong những lỗ hổng tiêu chuẩn mà bạn đã nghiêm cấm.
Bạch tuộc

Câu trả lời:


18

Bash + curl + iproute2 , 54 50 49 48 33 byte

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

Cảm ơn @DomHastings đã chơi golf 1 byte!

Cảm ơn @Sisyphus đã đưa ra một URL ngắn hơn!

Cảm ơn @zeppelin đã chơi golf 9 byte!


@DomHastings Lần chơi gôn cuối cùng của bạn trả lại một số rác cùng với địa chỉ IP, ít nhất là trên Ubuntu 16.04.3 LTS
Ferrybig

@Ferrybig Vâng, 1/0phần này xuất ra lỗi với STDERR, nhưng mặc định đó bị bỏ qua, nếu bạn nhận được đầu ra khác nhau ip route, đó có thể chỉ là phiên bản tôi đang chạy trên máy của tôi. Xấu hổ!
Dom Hastings

Dòng đầu tiên in 1000cho tôi ... ip route get 1 đầu ra: ptpb.pw/pixx
Majora320

Khi tôi chạy mã đó, tôi nhận được kết quả đầu ra này:RTNETLINK answers: Network is unreachable
kasperd

1
Bạn cũng có thể tối ưu hóa biểu thức AWK của mình một chút:awk 'NR<2&&$0=$7'
zeppelin

9

Bash 37 31 27 byte

Điều này được lấy cảm hứng từ câu trả lời của Bruce Forte . Câu trả lời đó chỉ hoạt động với IPv4 có nghĩa là nó không hoạt động với tôi. Tôi đã viết lại nó thành một phiên bản (chỉ) hoạt động với IPv6:

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

Điều này đã được thử nghiệm trên Ubuntu 14.04.5 được kết nối thông qua PPPoE và vì IPv6 được thiết kế để sử dụng mà không cần bất kỳ NAT nào, nó sẽ xuất ra cùng một địa chỉ IP hai lần.

-6 byte nhờ zeppelin , -2 byte nhờ vào Ferrybig , -2 byte nhờ Markasoftware .


Trên Ubuntu 16.04.3 LTS của tôi, tôi đã phải thay đổi '{print$11,$11}'để '{print$9,$9}'làm cho lệnh hoạt động, lệnh của bạn đã trả về 1024 2 lần, Lệnh của bạn hoạt động trên máy Ubuntu 16.04.2 của tôi
Ferrybig

@Ferrybig Có lẽ phụ thuộc vào cấu hình mạng rồi. Tôi đã thử nghiệm điều này trên một mạng nơi các địa chỉ được cấu hình tự động từ các quảng cáo bộ định tuyến.
kasperd

Đối với các máy có địa chỉ IP được cấu hình thủ công (tĩnh), ip routekhông xuất ra proto raphần đó, bạn có thể sử dụng phần này như một tính năng để đánh golf câu trả lời của mình hơn nữa
Ferrybig

@Ferrybig Hiện tại tôi đang suy nghĩ xem liệu tôi có thể tìm ra cách để làm cho nó hoạt động trong cả hai trường hợp mà không có kích thước nổ tung. Btw. trên máy 16.04.3 của tôi đã nhận được cấu hình sử dụng quảng cáo bộ định tuyến thì proto statickhông proto ra, mặc dù sự khác biệt đó không quan trọng với mã này.
kasperd

Để chơi golf một chút, sử dụng awk '$0=$9" "$9'thay vì {print$11,$11}. Nhiều hệ thống (bao gồm cả Arch của tôi) sử dụng từ thứ 9, vì vậy nó ngắn hơn 11 và cũng sử dụng cú pháp này nhỏ hơn in $ 9, $ 9
mềm markasoftware

7

Toán học, 17 byte

Mathematica có sẵn nội dung cho mọi thứ

$MachineAddresses

Như được mô tả trong tài liệu , lệnh dựng sẵn này liệt kê tất cả các địa chỉ IP (cả cục bộ và bên ngoài) được liên kết với thiết bị của bạn.


Các tài liệu không nói bất cứ điều gì về địa chỉ bên ngoài.
kasperd

Nếu lệnh này cũng liệt kê địa chỉ ipv6, thì bạn có thể nói địa chỉ ipv6 là kết quả mong đợi
Ferrybig

5
Điều này tạo ra một danh sách một số địa chỉ IP cho tôi, nhưng không ai trong số chúng dường như là địa chỉ bên ngoài của tôi; Tôi có thể không được giải thích chính xác, mặc dù. Tôi có thể lấy địa chỉ IP bên ngoài của mình từ một cái gì đó giống như WolframAlpha["ip address", {{"IPAddress:InternetData", 1}, "ComputableData"}][[1,2]]nhưng tôi không biết làm thế nào để có được địa chỉ đó trực tiếp hơn.
Đánh dấu S.

@Điểm. Lạ thật đấy; Tôi nhận được địa chỉ IP bên ngoài của mình khi tôi chạy lệnh (mục cuối cùng có vẻ là nó). Lệnh này sẽ không hoạt động trên Wolfram Sandbox. Có lẽ đây là một lỗi; bạn đang sử dụng phiên bản hệ điều hành và Mathicala nào?
JungHwan Min

@JungHwanMin 11.1.1.0 Phiên bản sinh viên cung cấp cho tôi 6 thứ mà tôi giả sử là IPv6, sau đó là 192.168.0.104 và ba địa chỉ bắt đầu bằng 169.254. Nhưng địa chỉ bên ngoài của tôi bắt đầu bằng 69.
Mark S.

6

Tự động, 56 53 byte

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

@IPAddress1 là một macro trả về

Địa chỉ IP của bộ điều hợp mạng đầu tiên

_GetIP() trả lại

địa chỉ IP công cộng.


-3 byte nhờ @ mınxomaτ


3
Neat, một AutoIt đồng nghiệp (không phải IT) -er. Bạn có thể xóa các khoảng trắng trong mã này.
mınxomaτ

@ mınxomaτ Cảm ơn bạn đã sửa :)
Daniel

6

C #, 196 194 188 163 byte

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

Đã lưu 2 byte nhờ @Xynos.
Đã lưu 25 byte nhờ @Nick.

Phiên bản đầy đủ / định dạng:

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();
        }
    }
}

Bạn không thể lưu hai byte bằng cách xóa khoảng trắng xung quanh ==?
MysticVagabond

@Xynos Tất nhiên, tôi không nhận ra tôi đã xóa nó.
TheLethalCoder

Phiên bản chơi gôn không biên dịch và không phải là một chức năng độc lập. Có vẻ không công bằng khi trộn một chức năng độc lập với lối tắt sử dụng không gian tên Sockets, vì vậy tôi khuyên bạn nên chọn một tùy chọn và đi với nó. Điều đó nói rằng, bạn có thể lưu một số byte bằng cách truyền i.AddressFamilyvào intthay vì truyền 2tới AddressFamilyvà bạn có thể thay thế Dns.GetHostName()bằng chuỗi trống.
Nick

@Nick Tôi sẽ thử khi tôi có cơ hội và namespacemẹo này khá phổ biến đối với C #. Nếu bạn nghĩ rằng nó không được phép, bạn có thể đăng lên meta về nó nhưng tại thời điểm này, đây là một trò chơi công bằng và một mẹo nhỏ trong việc rút ngắn usings.
TheLethalCoder

6

PowerShell v4 +, 40 36 byte

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

(Chỉ hoạt động trên Server 2012 R2 trở lên hoặc Windows 8.1 trở lên. Không hoạt động trên TIO.)

Chính xác như nói trên họp thiếc. Lấy địa chỉ IP mạng cục bộ và chỉ chọnIPA phần giả của chúng (ví dụ: lọc ra mặt nạ mạng con, cổng, v.v.).

Thứ hai là một Invoke-WebRequestđể http://eth0.memà chỉ đơn giản nhận được Content đó; tức là chỉ địa chỉ IP công cộng.


Phiên bản bị đánh cắp:

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

Một người dùng ẩn danh đề nghị xóaGet-
Stephen

@StepHen Thật vậy. Công trình tuyệt vời.
admBorkBork

4

Unix Shell + stunclient , 40 byte

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

Sử dụng giao thức STUN :

Các tiện ích phiên truy cập phiên cho NAT (STUN) là một giao thức đóng vai trò là công cụ cho các giao thức khác trong việc xử lý truyền tải địa chỉ mạng (NAT). Nó có thể được sử dụng bởi một điểm cuối để xác định địa chỉ IP và cổng được phân bổ cho nó bởi NAT

Tên máy chủ STUN là từ danh sách máy chủ STUN công cộng .

Định dạng đầu ra là:

 LOCAL IPV4 ADDRESS
 PUBLIC IPV4 ADDRESS

Lưu ý rằng cả hai dòng sẽ được thụt lề với một khoảng trắng, nhưng tôi tin rằng điều này không phá vỡ các quy tắc đầu ra như được viết.

Đầu ra mẫu:

  192.168.1.100    
  209.85.233.147

4

curl (bash one-liner): 27 byte

curl -w%{local_ip} eth0.me

Kết quả được in trên stdoutvà trông như thế này:

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

curl ít nhất phải là phiên bản 7.29.0 (từ ngày 6 tháng 2 năm 2013).

Câu trả lời dựa trên /codegolf//a/139538/66016 .


4

Đi, chỉ MacOS, 10 byte

Trong macOS, killswitch này có thể được sử dụng, nó có thể in IP hoạt động riêng tư và IP công cộng hiện tại:

$ 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

Đây không phải là một công cụ tích hợp nhưng cố gắng đơn giản hóa quá trình tìm IP thích hợp.

Đầu ra có thể nhận được bằng cách sử dụng các lệnh như:

$ route get 0.0.0.0

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

$ networksetup -listnetworkserviceorder

$ scutil --dns

IP công cộng:

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

2
Chào! Chào mừng đến với PPCG! Câu hỏi này được gắn thẻ mã golf . Bạn có thể cung cấp mã golf với một ngôn ngữ và số byte không?
Stephen

3

PowerShell v3 + (câu trả lời thay thế cho windows 7+)

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

2
Chào mừng đến với PPCG!
Stephen

1
Bạn có thể xóa các khoảng trắng xung quanh -matchđể lưu một vài byte.
admBorkBork

3

Bash + Awk + Curl, 43 byte

chỉ sử dụng các công cụ tích hợp cho Mac và Linux

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

1
* bash bạn có nghĩa là.
Suici Doga

bash + awk + curl
Alex Nikiforov

tôi đã chỉnh sửa câu hỏi để nói bash vì nó hoạt động trên máy tính xách tay linux của tôi không chỉ là macos
Suici Doga

Thx, tôi đã cải thiện vì bash là shell per se (nên hoạt động trên tcsh, sh và bất kỳ shell nào khác), bạn cần phải có ifconfig, awk và curl nữa
Alex Nikiforov

1
Đây không phải là "MacOS / Linux", đó là Bash. Chỉ cần đánh dấu nó như vậy.
LyricLy

2

Python 3, 124 133 byte

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

Bạn cũng không cần phải print a,bsao? Thật thú vị, điều này không xuất ra hai IP trên hệ thống của tôi (Win7), nhưng không ai trong số chúng là địa chỉ IP cục bộ thực sự của tôi. bthực sự là IP của bộ điều hợp ảo chứ không phải kết nối cục bộ của tôi .
Bạch tuộc

Mặc dù có thể cho rằng, đó vẫn là một địa chỉ Ip cục bộ . Tôi đã để lại một bình luận về Câu hỏi để yêu cầu làm rõ về điều đó.
Bạch tuộc

@Octopus bạn đúng về việc in ấn, cập nhật
Teo

Trong một chỉnh sửa được đề xuất, @David đã đề xuất điều này: 113 byte ( Xem lại tại đây )
Stephen

2

Node.js (JavaScript) 224 223 194 175 173 130 byte

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

Phiên bản bị đánh cắp:

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

  • Đã lưu 1 byte (do dấu chấm phẩy không cần thiết).
  • Đã lưu 29 byte nhờ @AndrewLi (các hàm mũi tên được sử dụng cho mã ngắn hơn).
  • Đã lưu 19 byte nhờ @MiniGod (được sử dụng .get()thay vì .request()- .end();loại bỏ).
  • Đã lưu 2 byte nhờ @ Zacharý (dấu ngoặc đơn không cần thiết xung quanh một tham số đơn độc của hàm mũi tên).
  • Đã lưu 43 byte nhờ @Birjolaxew (được lưu trữ requireconsole.logtrong các biến đơn, chuyển url trực tiếp đến require('http').get, đầu ra được ghi trực tiếp từ datasự kiện).

Bạn không thể sử dụng các hàm mũi tên cho mã ngắn hơn?
Andrew Li

@AndrewLi Đề nghị tuyệt vời, cảm ơn. :)

Bạn có thể sử dụng .get()thay vì .request(). Sau đó, bạn cũng không cần .end();.
MiniGod

1
Bạn không cần parens xung quanh một tham số đơn độc của hàm mũi tên. ( (a)=>=> a=>), IIRC.
Zacharý

1
@AndrewLi Hmm, vấn đề là khi mã được chạy trong REPL, nó sẽ in ra thông tin bổ sung (ví dụ: thông tin yêu cầu), điều này bị cấm trong câu hỏi. Tôi có thể thêm mã bổ sung để ẩn đầu ra này, nhưng nó có thể chống lại việc giảm byte dẫn đến việc bỏ requirecuộc gọi, vì vậy tôi sẽ để nó ngay bây giờ. Cảm ơn vì lời đề nghị nào.

1

Tập tin hàng loạt của Windows , 116 byte

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

Dòng đầu tiên lặp lại thông qua kết quả chạy ipconfig and gets your local IPv4 address.

Đối với phần IP công cộng, tôi đã phải ăn cắp một chút từ câu trả lời tuyệt vời của Powershell bởi vì, theo như tôi biết, không có cách nào để có được IP công khai của máy chỉ bằng cách sử dụng tập lệnh.

Chúng tôi bắt đầu bằng một @dấu hiệu, để chặn tiếng vang nhắc nhở ( C:\...\path>), sau đó chạy lệnh PowershellInvoke-WebRequest (with its alias, iwr) and extract the content part of that.

Tôi đã thử nghiệm với not using (...).content and, instead, only running the command and extracting the actual information from the complete output, using batch. But that proved to be way longer than this solution, so I kept it.

Đã thử nghiệm trên Windows 10.0.15063.


1

R, 142 , 140 , 137 byte

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

Đã thử nghiệm trên win10 và R (3.4.1).
Cảm ơn @ Bruce-Forte vì URL ngắn.

Phiên bản bị đánh cắp:

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

Xuống tới 120 byte Hãy thử trực tuyến!
BLT

@BLT giải pháp tốt đẹp. Bạn có thể tiết kiệm 3 byte, bằng cách thay thế a <- nchar(x)bằnga=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."
ბიმო

Doesn't -I (capital) have a different use than -i (lowercase). The bit you quoted was from the -I section.
Probably

True, sorry about that. But even worse it says "Avoid using this option", either way this doesn't work (at least on my machines)..
ბიმო

Right, admittedly I did not read the full documentation before posting. Oddly enough it seems to work fine on a few of my machines. But this inconsistency would make this solution unreliable at best.
Probably

1

MS-SQL, 59 bytes

SELECT TOP 1 local_net_address
FROM sys.dm_exec_connections

Returns the client-facing IP address of the SQL instance executing the query.


0

VBA, 58 Bytes

Whoops, does not handle local address - fix in progress

Note: Uses reference to

Microsoft Internet Controls

Anonymous VBE immediate window function that takes no input and outputs the user's IP address via an Internet Explorer window

Set i=New InternetExplorer:i.Visible=1:i.Navigate"eth0.me"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.