Ruby: получить локальный IP (nix) - PullRequest
14 голосов
/ 17 февраля 2011

Мне нужно получить свой IP (то есть DHCP). Я использую это в моем environment.rb:

LOCAL_IP = `ifconfig wlan0`.match(/inet addr:(\d*\.\d*\.\d*\.\d*)/)[1] || "localhost"

Но есть ли рубин или более чистый раствор?

Ответы [ 3 ]

30 голосов
/ 18 октября 2011

Сервер обычно имеет более одного интерфейса, по крайней мере, один закрытый и один общедоступный.

Поскольку все ответы здесь касаются этого простого сценария, более простой способ - запросить у 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, используемые для фильтрации требуемого адреса интерфейса.

11 голосов
/ 17 февраля 2011
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

Найдено здесь .

7 голосов
/ 17 февраля 2011

Вот небольшая модификация решения Стинслага

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