Ruby:获取本地IP(nix)

时间:2011-02-17 13:17:06

标签: ruby unix ip

我需要获取我的IP(即DHCP)。我在environment.rb

中使用此功能
LOCAL_IP = `ifconfig wlan0`.match(/inet addr:(\d*\.\d*\.\d*\.\d*)/)[1] || "localhost"

但有没有rubyway或更清洁的解决方案?

3 个答案:

答案 0 :(得分:30)

服务器通常有多个接口,至少一个私有接口和一个公共接口。

由于这里的所有答案都涉及这个简单的场景,更简洁的方法是向Socket询问当前的ip_address_list(),如下所示:

require 'socket'

def my_first_private_ipv4
  Socket.ip_address_list.detect{|intf| intf.ipv4_private?}
end

def my_first_public_ipv4
  Socket.ip_address_list.detect{|intf| intf.ipv4? and !intf.ipv4_loopback? and !intf.ipv4_multicast? and !intf.ipv4_private?}
end

两者都返回一个Addrinfo对象,所以如果你需要一个字符串,你可以使用ip_address()方法,如:

ip= my_first_public_ipv4.ip_address unless my_first_public_ipv4.nil?

您可以轻松地找到更合适的解决方案来更改用于过滤所需接口地址的Addrinfo方法。

答案 1 :(得分:11)

require 'socket'

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 '64.233.187.99', 1 #google
    s.addr.last
  end
ensure
  Socket.do_not_reverse_lookup = orig
end

puts local_ip

找到here

答案 2 :(得分:7)

这是对steenslag解决方案的一个小修改

require "socket"
local_ip = UDPSocket.open {|s| s.connect("64.233.187.99", 1); s.addr.last}