Мне нужно получить свой IP-адрес (это DHCP). Я использую это в своем environment.rb
:
LOCAL_IP = `ifconfig wlan0`.match(/inet addr:(\d*\.\d*\.\d*\.\d*)/)[1] || "localhost"
Но есть ли rubyway или более чистое решение?
Мне нужно получить свой IP-адрес (это DHCP). Я использую это в своем environment.rb
:
LOCAL_IP = `ifconfig wlan0`.match(/inet addr:(\d*\.\d*\.\d*\.\d*)/)[1] || "localhost"
Но есть ли rubyway или более чистое решение?
Обычно сервер имеет несколько интерфейсов, по крайней мере один частный и один публичный.
Поскольку все ответы здесь касаются этого простого сценария, более чистый способ - спросить 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, используемые для фильтрации требуемого адреса интерфейса.
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
Найден здесь.
Вот небольшая модификация решения steenslag
require "socket"
local_ip = UDPSocket.open {|s| s.connect("64.233.187.99", 1); s.addr.last}