我需要获取我的IP(即DHCP)。我在environment.rb
:
LOCAL_IP = `ifconfig wlan0`.match(/inet addr:(\d*\.\d*\.\d*\.\d*)/)[1] || "localhost"
但有没有rubyway或更清洁的解决方案?
答案 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}