はじめに
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
- networking - Finding local IP addresses using Python's stdlib - Stack Overflow
- sockets - Python - Get localhost IP - Stack Overflow
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かというとそんなことは無いので、必要に応じて微調整が必要。