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

  • 21
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

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かというとそんなことは無いので、必要に応じて微調整が必要。