How to get my machine's IP address from Ruby without leveraging from other IP address?

user1535147 picture user1535147 · Jan 1, 2013 · Viewed 33.1k times · Source

I have searched everywhere but their solution requires some form of IP address. Here are the solutions i have found.

    require 'socket'
#METHOD 1
    ip = IPSocket.getaddress(Socket.gethostname)
    puts ip 

#METHOD 2
    host = Socket.gethostname
    puts host

#METHOD 3(uses Google's address)
    ip = UDPSocket.open {|s| s.connect("64.233.187.99", 1); s.addr.last}
    puts ip

#METHOD 4(uses gateway address)
    def local_ip
      orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true  # turn off reverse DNS resolution temporarily

      UDPSocket.open do |s|
        s.connect '192.168.1.1', 1
        s.addr.last
      end
    ensure
      Socket.do_not_reverse_lookup = orig
    end

    ip=local_ip
    puts ip

All of them require IP address of someone. Is there a solution that does not use someone else's IP address? Preferably, platform independent.

Answer

Itay Grudev picture Itay Grudev · Dec 13, 2014

Isn't the solution you are looking for just:

require 'socket'

addr_infos = Socket.ip_address_list

Since a machine can have multiple interfaces and multiple IP Addresses, this method returns an array of Addrinfo.

You can fetch the exact IP addresses like this:

addr_infos.each do |addr_info|
  puts addr_info.ip_address
end

You can further filter the list by rejecting loopback and private addresses, as they are usually not what you're interested in, like so:

addr_infos.reject( &:ipv4_loopback? )
          .reject( &:ipv6_loopback? )
          .reject( &:ipv4_private? )