Apa Alamat IP saya?

24

Saya terkejut ini belum muncul dalam tantangan.

Keluarkan alamat IP mesin yang Anda jalankan. Anda diminta untuk menampilkan alamat IP lokal dan eksternal.

Alamat IP lokal, yaitu sepanjang format default 192.168.xx

Alamat IP publik dapat diverifikasi dengan menggunakan google https://www.google.co.id/search?source=hp&q=whats+my+ip

Output dapat dalam format apa pun. IPv4 atau IPv6 atau campuran apa pun dari masing-masing diperbolehkan, namun mereka harus menjadi satu-satunya output. Kode dapat berupa program atau fungsi lengkap.

aturan berlaku sehingga kode terpendek menang.

Celah Standar dilarang.

EDIT: Sesuai dengan komentar @Peter Taylor, dalam kasus di mana beberapa jenis alamat hadir, Anda dapat memilih untuk menampilkan yang pertama, atau sebanyak yang dapat Anda akses. Selama setidaknya satu lokal dan satu publik hadir.

MysticVagabond
sumber
3
Saya pikir 0/1hal itu menambah tantangan yang tidak perlu.
Tn. Xcoder
5
Ini tidak ditentukan secara spesifik. Secara khusus, itu tidak jelas menangani kasus-kasus di mana ada beberapa alamat IP lokal dan / atau beberapa alamat IP publik. Selain itu, tidak ada cara yang dapat diandalkan untuk mengatakan apakah saya memiliki beberapa alamat IP publik, dan jika demikian, apa alamatnya.
Peter Taylor
5
Bagaimana jika tuan rumah tidak memiliki alamat RFC 1918? Sepertinya tidak ada jawaban yang dapat diandalkan untuk ini, kecuali pada mesin yang memiliki setidaknya satu jaringan pribadi.
Toby Speight
4
... dan bahkan satu antarmuka jaringan dapat memiliki beberapa alamat IP.
Kaz
14
Sebenarnya, saya tidak melihat bagaimana Anda bisa menyelesaikan setengah dari ini tanpa mengambil dari sumber eksternal , yang merupakan salah satu celah standar yang secara tegas dilarang.
Octopus

Jawaban:

18

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

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

Terima kasih @HomHastings untuk bermain golf 1 byte!

Terima kasih @Sisyphus untuk membuat URL yang lebih pendek!

Terima kasih @zeppelin untuk bermain golf 9 byte!

ბიმო
sumber
@HomHastings Upaya golf terakhir Anda mengembalikan sampah bersama dengan alamat ip, setidaknya di Ubuntu 16.04.3 LTS
Ferrybig
@ Ferrybig Ya, 1/0bagian ini menghasilkan kesalahan pada STDERR, tapi itu diabaikan secara default, jika Anda mendapatkan output yang berbeda untuk itu ip route, itu bisa saja versi yang saya jalankan di mesin saya. Malu!
Dom Hastings
Baris pertama mencetak 1000untuk saya ... ip route get 1output: ptpb.pw/pixx
Majora320
Ketika saya menjalankan kode itu saya mendapatkan output ini:RTNETLINK answers: Network is unreachable
kasperd
1
Anda juga dapat sedikit mengoptimalkan ekspresi AWK Anda:awk 'NR<2&&$0=$7'
zeppelin
9

Bash 37 31 27 byte

Ini terinspirasi oleh jawaban oleh Bruce Forte . Jawaban itu hanya berfungsi dengan IPv4 yang artinya tidak berfungsi untuk saya. Saya telah menulis ulangnya menjadi versi yang (hanya) berfungsi dengan IPv6:

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

Ini diuji pada Ubuntu 14.04.5 yang terhubung melalui PPPoE dan karena IPv6 dirancang untuk digunakan tanpa NAT, ia akan menampilkan alamat IP yang sama dua kali.

-6 bytes berkat zeppelin , -2 bytes berkat Ferrybig , -2 bytes berkat Markasoftware .

kasperd
sumber
Pada saya Ubuntu 16.04.3 LTS, saya harus mengubah '{print$11,$11}'untuk '{print$9,$9}'membuat pekerjaan perintah, perintah Anda kembali 1024 2 kali, perintah karya Anda pada mesin Ubuntu 16.04.2
Ferrybig
@ Jerrybig Mungkin tergantung pada konfigurasi jaringan. Saya menguji ini di jaringan di mana alamat dikonfigurasi secara otomatis dari iklan router.
kasperd
Untuk mesin yang alamat ipnya dikonfigurasikan secara manual (statis), ip routetidak menampilkan proto rabagian tersebut, Anda dapat menggunakan ini sebagai fitur untuk
menambah
@ Ferrybig Saat ini saya sedang merenungkan apakah saya dapat menemukan cara untuk membuatnya bekerja dalam kedua kasus tanpa ukuran yang meledak. Btw. pada mesin 16.04.3 saya yang menerima konfigurasinya menggunakan iklan router yang katanya proto statictidak proto ra, meskipun perbedaan itu tidak masalah dengan kode ini.
kasperd
Untuk sedikit golf, gunakan awk '$0=$9" "$9'saja {print$11,$11}. Banyak sistem (termasuk Arch satu saya) menggunakan kata 9, jadi lebih pendek dari 11, dan juga menggunakan sintaks ini lebih kecil daripada mencetak $ 9, $ 9
markasoftware
7

Mathematica, 17 byte

Mathematica memiliki dasar untuk segalanya

$MachineAddresses

Sebagaimana dijelaskan dalam dokumentasi , perintah bawaan ini mencantumkan semua alamat IP (baik lokal maupun eksternal) yang terkait dengan perangkat Anda.

JungHwan Min
sumber
Dokumentasi tidak mengatakan apa-apa tentang alamat eksternal.
kasperd
Jika perintah ini juga mencantumkan alamat ipv6, maka Anda dapat mengatakan alamat ipv6 adalah hasil yang diharapkan
Ferrybig
5
Ini menghasilkan daftar beberapa alamat IP untuk saya, tetapi tidak satupun dari mereka yang tampaknya menjadi alamat eksternal saya; Saya mungkin tidak menafsirkan hal-hal dengan benar. Saya bisa mendapatkan alamat IP eksternal saya dari sesuatu seperti WolframAlpha["ip address", {{"IPAddress:InternetData", 1}, "ComputableData"}][[1,2]]tetapi saya tidak tahu bagaimana mendapatkannya secara langsung.
Mark S.
@Tanda. Itu aneh; Saya mendapatkan alamat IP eksternal saya ketika saya menjalankan perintah (entri terakhir sepertinya adalah itu). Namun, perintah ini tidak akan berfungsi di Wolfram Sandbox. Mungkin ini bug; versi OS dan Mathematica apa yang Anda gunakan?
JungHwan Min
@JungHwanMin 11.1.1.0 Student Edition memberi saya 6 hal yang saya asumsikan adalah IPv6, kemudian 192.168.0.104, dan tiga alamat dimulai dengan 169.254. Tetapi alamat eksternal saya dimulai dengan 69.
Mark S.
6

Otomatis, 56 53 byte

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

@IPAddress1 adalah makro yang mengembalikan

Alamat IP adaptor jaringan pertama

_GetIP() kembali

alamat IP publik.


-3 byte terima kasih kepada @ mınxomaτ

Daniel
sumber
3
Rapi, sesama AutoIt (bukan IT) -er. Anda dapat menghapus spasi dalam kode ini.
mınxomaτ
@ mınxomaτ Terima kasih atas koreksi :)
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")}

Disimpan 2 byte berkat @Xynos.
Disimpan 25 byte berkat @Nick.

Versi Lengkap / Diformat:

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
sumber
Anda tidak dapat menyimpan dua byte dengan menghapus spasi di sekitar ==?
MysticVagabond
@Xynos Tentu saja, tidak menyadari saya belum menghapusnya.
TheLethalCoder
Versi golf tidak mengkompilasi dan bukan fungsi mandiri. Tampaknya tidak adil untuk mencampur fungsi mandiri dengan cara pintas menggunakan namespace Sockets, jadi saya sarankan memilih satu opsi dan menggunakannya. Yang mengatakan, Anda dapat menyimpan beberapa byte dengan casting i.AddressFamilyuntuk intbukannya casting 2untuk AddressFamily, dan Anda dapat mengganti Dns.GetHostName()dengan string kosong.
Nick
@Nick Saya akan mencoba itu ketika saya mendapatkan kesempatan dan namespacetriknya cukup umum untuk C #. Jika Anda berpikir itu seharusnya tidak diperbolehkan, Anda dapat memposting di meta tentang hal itu tetapi saat ini itu adalah permainan yang adil dan trik yang rapi dalam memperpendek usings.
TheLethalCoder
6

PowerShell v4 +, 40 36 byte

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

(Hanya berfungsi di Server 2012 R2 atau lebih tinggi, atau Windows 8.1 atau lebih baru. Tidak berfungsi pada TIO.)

Melakukan persis apa yang tertulis di kaleng. Mendapat alamat IP jaringan lokal dan memilih hanya bagian IPApenyisipan darinya (misalnya, menyaring subnet mask, gateway, dll.).

Yang kedua adalah Invoke-WebRequestuntuk http://eth0.meyang hanya mendapat Cmenurunkan kandungan daripadanya; yaitu, hanya alamat IP publik.


Versi tidak disatukan:

(Get-NetIPAddress).IPAddress
(Invoke-WebRequest eth0.me).content
AdmBorkBork
sumber
Seorang pengguna anonim menyarankan untuk menghapusGet-
Stephen
@Langkah Memang. Bagus sekali.
AdmBorkBork
4

Unix Shell + stunclient , 40 byte

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

Menggunakan protokol STUN :

Session Traversal Utilities for NAT (STUN) adalah protokol yang berfungsi sebagai alat untuk protokol lain dalam berurusan dengan Network Address Translator (NAT) traversal. Ini dapat digunakan oleh titik akhir untuk menentukan alamat IP dan port yang dialokasikan kepadanya oleh NAT

Nama server STUN berasal dari daftar server STUN Publik .

Format output adalah:

 LOCAL IPV4 ADDRESS
 PUBLIC IPV4 ADDRESS

Perhatikan bahwa kedua baris akan di-indentasi dengan satu spasi, tapi saya percaya ini tidak melanggar aturan keluaran seperti yang tertulis.

Output sampel:

  192.168.1.100    
  209.85.233.147
zeppelin
sumber
4

curl (bash one-liner): 27 byte

curl -w%{local_ip} eth0.me

Hasilnya dicetak stdoutdan terlihat seperti ini:

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

curl harus paling tidak dari versi 7.29.0 (mulai 6 Februari 2013).

Jawabannya didasarkan pada /codegolf//a/139538/66016 .

Kirill Bulygin
sumber
4

Pergi, hanya MacOS, 10 byte

Di macOS killswitch ini dapat digunakan, ia dapat mencetak IP aktif pribadi dan IP publik:

$ 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

Ini bukan alat bawaan tetapi mencoba menyederhanakan proses menemukan IP yang tepat.

Output bisa didapat dengan menggunakan perintah seperti:

$ route get 0.0.0.0

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

$ networksetup -listnetworkserviceorder

$ scutil --dns

IP Publik:

$ dig o-o.myaddr.l.google.com @ns.google.com txt +short
nbari
sumber
2
Hai! Selamat datang di PPCG! Pertanyaan ini ditandai dengan kode-golf . Bisakah Anda memberikan kode golf dengan bahasa dan jumlah byte?
Stephen
3

PowerShell v3 + (jawaban alternatif untuk windows 7+)

((ipconfig) -match "v4").split(":")[1]
Invoke-RestMethod eth0.me
YChi Lu
sumber
2
Selamat datang di PPCG!
Stephen
1
Anda dapat menghapus spasi di sekitarnya -matchuntuk menyimpan beberapa byte.
AdmBorkBork
3

Bash + Awk + Curl, 43 byte

hanya menggunakan alat bawaan untuk Mac dan Linux

ifconfig|awk '/bro/{print $2}';curl eth0.me
Alex Nikiforov
sumber
1
* bash maksudmu.
Suici Doga
bash + awk + curl
Alex Nikiforov
saya mengedit pertanyaan untuk mengatakan bash karena ini bekerja pada laptop linux saya bukan hanya macos
Suici Doga
thx, saya membaik karena bash adalah shell per se (harus bekerja pada tcsh, sh dan shell lainnya), Anda perlu memiliki ifconfig, awk dan curl juga
Alex Nikiforov
1
Ini bukan "MacOS / Linux", ini Bash. Tandai saja seperti itu.
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
Teo
sumber
Bukankah kamu juga perlu print a,b? Menariknya, ini menghasilkan dua IP pada sistem saya (Win7), tetapi tidak satu pun dari mereka adalah alamat IP lokal saya yang sebenarnya. bsebenarnya adalah IP dari adaptor virtual dan bukan Local Area Connection saya .
Octopus
Namun bisa dibilang, itu masih merupakan alamat Ip lokal . Saya meninggalkan komentar pada Pertanyaan untuk meminta klarifikasi tentang itu.
Octopus
@Octopus Anda benar sedang tentang pencetakan, diperbarui
Teo
Dalam sunting yang disarankan, @ David menyarankan ini: 113 byte ( Ulasan di sini )
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+"")))

Versi tidak disatukan:

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

  • Disimpan 1 byte (karena titik koma yang tidak perlu).
  • Disimpan 29 byte berkat @AndrewLi (fungsi panah yang digunakan untuk kode yang lebih pendek).
  • Disimpan 19 byte berkat @MiniGod (digunakan .get()sebagai ganti .request()- .end();dihapus).
  • Disimpan 2 byte berkat @ Zacharý (tanda kurung tidak diperlukan di sekitar parameter fungsi panah tunggal).
  • Disimpan 43 byte berkat @Birjolaxew (disimpan requiredan console.logdalam variabel huruf tunggal, diteruskan ke url langsung require('http').get, keluaran log langsung dari dataacara).

sumber
Tidak bisakah Anda menggunakan fungsi panah untuk kode yang lebih pendek?
Andrew Li
@AndrewLi Saran yang bagus, terima kasih. :)
Anda bisa menggunakan .get()bukan .request(). Maka Anda juga tidak perlu .end();.
MiniGod
1
Anda tidak perlu parens di sekitar parameter tunggal dari fungsi panah. ( (a)=>=> a=>), IIRC.
Zacharý
1
@AndrewLi Hmm, masalahnya adalah ketika kode dijalankan di REPL, ia mencetak info tambahan (mis. Informasi permintaan), yang dilarang dalam pertanyaan. Saya bisa menambahkan kode tambahan untuk menyembunyikan output ini, tetapi mungkin menetralkan pengurangan byte yang dihasilkan dari meninggalkan requirepanggilan, jadi saya akan meninggalkannya untuk saat ini. Terima kasih atas sarannya.
1

File Batch Windows , 116 byte

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

Baris pertama beralih melalui hasil menjalankan ipconfigdan mendapatkan alamat IPv4 lokal Anda.

Untuk bagian IP publik, saya harus mencuri sedikit dari jawaban Powershell yang luar biasa karena, sejauh yang saya tahu, tidak ada cara untuk mendapatkan IP publik mesin dengan menggunakan hanya batch scripting.

Kita mulai dengan @tanda, untuk menekan echo prompt ( C:\...\path>), kemudian jalankan perintah Powershell Invoke-WebRequest(dengan aliasnya, iwr) dan ekstrak contentbagian dari itu.

Saya bereksperimen dengan tidak menggunakan (...).contentdan, sebaliknya, hanya menjalankan perintah dan mengekstraksi informasi aktual dari output lengkap, menggunakan batch. Tapi itu terbukti jauh lebih lama daripada solusi ini, jadi saya menyimpannya.

Diuji pada Windows 10.0.15063.

Matheus Avellar
sumber
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")

Diuji pada win10 dan R (3.4.1).
Terima kasih atas @ Bruce-Forte untuk URL pendek.

Versi tidak disatukan:

library(magrittr)
system("ipconfig",int=T) %>% 
     regmatches(.,regexpr("v4.+",.)) %>% 
      {a <- nchar(.)
       substr(., a - 14, a)}
readLines("http://eth0.me")
AndriusZ
sumber
Turun ke 120 byte Cobalah secara online!
BLT
@BLT solusi yang bagus. Anda dapat menghemat 3 byte, dengan mengganti a <- nchar(x)dengana=nchar(x)
AndriusZ
@AndruisZ terima kasih, tapi ini benar-benar solusi Anda - Saya hanya de-magrittr.
BLT
1

Python 2.7.13 128 byte

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

Bash + Curl, 24 byte

hostname -i;curl eth0.me
Mungkin
sumber
Ini tidak berfungsi .. Dari halaman manual: " Opsi ini menyebutkan semua alamat yang dikonfigurasi pada semua antarmuka jaringan. [...] Jangan membuat asumsi apa pun tentang urutan output."
ბიმო
Tidak -I (modal) memiliki penggunaan yang berbeda dari -i (huruf kecil). Bit yang Anda kutip berasal dari -I bagian.
Mungkin
Benar, maaf soal itu. Tetapi lebih buruk lagi tertulis " Hindari menggunakan opsi ini ", baik cara ini tidak bekerja (setidaknya pada mesin saya) ..
ბიმო
Benar, memang saya tidak membaca dokumentasi lengkap sebelum memposting. Anehnya itu tampaknya berfungsi dengan baik pada beberapa mesin saya. Tetapi ketidakkonsistenan ini akan membuat solusi ini paling tidak dapat diandalkan.
Mungkin
1

MS-SQL, 59 byte

SELECT TOP 1 local_net_address
FROM sys.dm_exec_connections

Mengembalikan alamat IP yang dihadapi klien dari instance SQL yang menjalankan kueri.

BradC
sumber
0

VBA, 58 Bytes

Ups, tidak menangani alamat lokal - perbaikan sedang berlangsung

Catatan: Menggunakan referensi ke

Microsoft Internet Controls

Fungsi jendela langsung VBE anonim yang tidak mengambil input dan output alamat IP pengguna melalui jendela Internet Explorer

Set i=New InternetExplorer:i.Visible=1:i.Navigate"eth0.me"
Taylor Scott
sumber