私のIPアドレスは何ですか?


24

これがまだ課題になっていないことに驚いています。

実行中のマシンのIPアドレスを出力します。ローカルIPアドレスと外部IPアドレスの両方を出力する必要があります。

ローカルIPアドレス、つまり192.168.xxのデフォルト形式に沿って

パブリックIPアドレスは、Google https://www.google.co.uk/search?source=hp&q=whats+my+ipを使用して確認できます

出力は任意の形式にすることができます。IPv4またはIPv6、またはそれらの任意の組み合わせが許可されますが、それらが唯一の出力でなければなりません。コードは完全なプログラムでも関数でもかまいません。

規則が適用されるため、最短のコードが優先されます。

標準の抜け穴は禁止されています。

編集: @Peter Taylorのコメントによると、いずれかのタイプのアドレスが複数存在する場合、最初のアドレスを出力するか、アクセス可能な数だけ選択することができます。少なくとも1人のローカルおよび1人のパブリックが存在する限り。


3
この0/1ことにより、不必要な綿毛がチャレンジに追加されると思います。
ミスターXcoder

5
これは指定不足です。特に、複数のローカルIPアドレスや複数のパブリックIPアドレスが存在する場合には明確に対処していません。さらに、私が複数のパブリックIPアドレスを持っているかどうか、もしそうならそれが何であるかを判断する信頼できる方法はありません。
ピーターテイラー

5
ホストにRFC 1918アドレスがない場合はどうなりますか?少なくとも1つのプライベートネットワークを持つマシンを除き、これに対する信頼できる答えはないようです。
トビー・スペイト

4
...そして、1つのネットワークインターフェイスでさえ、複数のIPアドレスを持つことができます。
カズ

14
実際、外部ソースからフェッチせず にこの半分を解決する方法はわかりません。これは、明示的に禁止されている標準的な抜け穴の1つです。
タコ

回答:


18

バッシュ+ カール + iproute2を54の50 49 48 33バイト

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

@DomHastingsに1バイトのゴルフをありがとう!

@Sisyphusに短いURLを提供してくれてありがとう!

9バイトオフのゴルフをありがとう@zeppelin!


@DomHastingsあなたの最後のゴルフの試みは、少なくとも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バイト

これは、ブルース・フォルテ答えに触発されています。その答えはIPv4でのみ機能します。つまり、私にとっては機能しません。私はそれを(のみ)IPv6で動作するバージョンに書き直しました:

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

これはPPPoEを介して接続されたUbuntu 14.04.5でテストされ、IPv6はNATなしで使用するように設計されているため、同じIPアドレスを2回出力します。

zeppelinのおかげで-6バイト、Ferrybigのおかげで-2バイト、Markasoftwareのおかげで-2バイト。


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

@Ferrybig現時点では、どちらの場合でも、サイズを大きくすることなく機能させる方法を見つけることができるかどうか考えています。ところで ルータアドバタイズメントを使用して設定を受け取った16.04.3マシンでは、proto staticnot proto raと表示されますが、このコードにはその違いは関係ありません。
カスペルド

少しゴルフをするには、のawk '$0=$9" "$9'代わりに使用します{print$11,$11}。多くのシステム(私のArch 1を含む)は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]]から取得できますが、それをもっと直接取得する方法がわかりません。
マークS。17年

@MarkS。それは奇妙です。コマンドを実行すると、外部IPアドレスが取得されます(最後のエントリはそのようです)。ただし、このコマンドはWolfram Sandboxでは機能しません。おそらくこれはバグです。使用しているOSとMathematicaのバージョンは何ですか?
ジョンファンミン

@JungHwanMin 11.1.1.0 Student Editionでは、IPv6、192.168.0.104、および169.254で始まる3つのアドレスを想定しています。しかし、私の外部アドレスは69で始まる
マーク・S.

6

AutoIt、56 53バイト

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

@IPAddress1 返すマクロです

最初のネットワークアダプターのIPアドレス

_GetIP() 返す

パブリックIPアドレス。


@mınxomaτのおかげで-3バイト


3
ニート、仲間のAutoIt(ITではない)-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")}

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

==の前後の空白を削除して2バイト節約することはできませんか?
MysticVagabond

@Xynosもちろん、私はそれを削除していないことに気づきませんでした。
TheLethalCoder

ゴルフバージョンはコンパイルされず、スタンドアロン機能ではありません。スタンドアロンの機能とSockets名前空間を使用するショートカットを混在させるのは公平ではないようです。そのため、1つのオプションを選択して使用することをお勧めします。とは言っても、にキャスト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-WebRequesthttp://eth0.me単純に取得したCそのontentと、つまり、パブリックIPアドレスだけです。


ゴルフされていないバージョン:

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

匿名ユーザーが削除することを提案Get-
スティーブン

@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

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以上である必要があります(2013年2月6日以降)。

答えは/codegolf//a/139538/66016に基づいています


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

3

Bash + Awk + ​​Curl、43バイト

MacおよびLinux用の組み込みツールのみを使用する

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

1
* bashという意味です。
Suiciドーガ

bash + awk + ​​curl
アレックスニキフォロフ

私はそれだけではなく、MacOSの私のLinuxラップトップ上で動作しますので、bashのを言うために、質問に編集
Suiciドーガ

THX、私はまた、bashは(tcshの場合、SHおよびその他のシェル上で動作するはずです)それ自体はシェルであることから、あなたはifconfigコマンドを持っている必要があり、awkのカールを改善
アレックス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)に2つのIPを出力しますが、どちらも実際のローカルIPアドレスではありません。bは実際には仮想アダプターのIPであり、ローカルエリア接続ではありません。
タコ

おそらく、それはまだローカルIPアドレスです。質問にコメントを残して、それについての説明を求めました。
タコ

@タコあなたは印刷について正しいです、更新
テオ

提案された編集で、@ 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バイトを保存しました(不要なセミコロンのため)。
  • @AndrewLi(短いコードに矢印関数を使用)のおかげで29バイト節約されました。
  • @MiniGodのおかげで19バイトを節約しました(-の.get()代わりに使用.request()- .end();削除)。
  • @Zacharýのおかげで2バイト節約されました(矢印関数の孤立したパラメーターの周りに括弧は不要です)。
  • @Birjolaxewのおかげで43バイト節約れました(1文字の変数に格納されrequireconsole.logURLに直接渡されrequire('http').getdataイベントから直接ログ出力されます)。

短いコードに矢印関数を使用できませんか?
アンドリューリー

@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の部分については、私が知る限り、バッチスクリプトのみを使用してマシンのパブリックIPを取得する方法がないため、すばらしいPowershellの回答から少し盗まなければなりませんでした。

@プロンプト(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")


@BLTすてきなソリューション。あなたは交換することにより、3つのバイトを保存することができa <- nchar(x)a=nchar(x)
AndriusZ

@AndruisZ感謝しますが、それは本当にあなたの解決策です-私はそれを単に非難しました。
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

クエリを実行するSQLインスタンスのクライアント側のIPアドレスを返します。


0

VBA、58バイト

おっと、ローカルアドレスを処理しません-修正中

注: への参照を使用

Microsoft Internet Controls

入力を受け取らず、Internet Explorerウィンドウを介してユーザーのIPアドレスを出力する匿名VBEイミディエイトウィンドウ機能

Set i=New InternetExplorer:i.Visible=1:i.Navigate"eth0.me"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.