27
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ローカルIPアドレスをプログラムで取得するには

Last updated at Posted at 2014-08-20

はじめに

Dockerで音を鳴らすという記事を書いた際に、Dockerコマンドを実行しているホストのローカルIPアドレスの取得方法が
気になり、最近使っている言語のいくつかでどうやって書くのか調べた。
OCamlも調べたが、ググる力と英語力が足りず断念。。。

Ruby

2.1以降

ruby -r socket -e 'puts Socket.getifaddrs.select{|x| x.name == "eth0" and x.addr.ipv4?}.first.addr.ip_address'

Link

Python

gethostnameを使う方法がすぐに出てきたが、Ubuntuなどでは、127.0.0.1を取得してしまうことが結構あるようで、それ以外の方法を探した。

python -c "import socket;print([(s.connect(('8.8.8.8', 80)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1])"
pip install netifaces
python -c "import netifaces;print(netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr'])"

Link

Perl

cpanm install IO::Interface
perl -MIO::Interface::Simple -e 'CORE::say IO::Interface::Simple->new(shift || "eth0")->address'

Link

Node.js

標準のモジュールでいい感じに出来、Windowsでも動いた。

node -e  "require('os').networkInterfaces()['eth0'].filter(function(elm){if(elm.family=='IPv4')console.log(elm.address)})"
node -e "require('os').networkInterfaces()['ローカル エリア接続'].filter(function(elm){if(elm.family=='IPv4') console.log(elm.address)})"

Link

シェル

hostname -I

OSXのhostnameコマンドはダメでした。

AppleScript

osascript -e "IPv4 address of (get system info)"

Link

まとめ

意外と、ローカルIPアドレスの取得は難しいことが分かった。多くの言語は別途モジュール等をインストールして
それを使って書くのがスマートでプラットフォーム依存が低く抑えられる感じだった。

残念ながら、ここに挙げた書き方でどんな環境でもOKかというとそんなことは無いので、必要に応じて微調整が必要。

関連記事

27
24
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?