Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby - Platform independent way to determine IPs of all network interfaces?

Is there an easy way in Ruby for me to get a list of the IP addresses for all network interfaces? It needs to work in Linux/Win/OSX and I'd prefer to not have to parse ifconfig/ipconfig unless I absolutely have to.

like image 561
Tindron Avatar asked Mar 16 '10 04:03

Tindron


3 Answers

As of Ruby 2.1, Socket#getifaddrs is available:

001:0> require 'socket'
=> true
002:0> Socket.getifaddrs.map { |i| i.addr.ip_address if i.addr.ipv4? }.compact
=> ["127.0.0.1", "192.168.1.121", "192.168.1.181"]
like image 162
Tindron Avatar answered Sep 22 '22 00:09

Tindron


Check out the following post:

http://coderrr.wordpress.com/2008/05/28/get-your-local-ip-address/

There's also a discussion on the solution anshul posted in the comments.

like image 21
Michael Kohl Avatar answered Sep 22 '22 00:09

Michael Kohl


I don't think ruby has a standard api for this but under some assumptions this should be fairly reliable across platforms:

require 'socket'
Socket::getaddrinfo(Socket.gethostname, 'echo', Socket::AF_INET).map { |x| x[3] }

Here we are assuming quite a few things like the machine having a local hostname pointing to the correct ip addresses. So, this is definitely not completely reliable but it's platform independent and works on the common setups.

Edit: If you decide to get down to parsing ifconfig, consider forking ruby-ifconfig. It claims to do that on most non-windows platforms already.

like image 20
anshul Avatar answered Sep 23 '22 00:09

anshul