Как получить IP-адрес моей локальной машины в Ruby?

Я занимаюсь разработкой Rails в ОС Ubuntu 12.04LTS.

Я хочу записать в файл свой локальный IP-адрес, а не loopback 127.0.0.1, который я получаю с помощью ifconfig. Пожалуйста, предложите решение.


person Rajesh Omanakuttan    schedule 24.12.2012    source источник
comment
вам нужно просто использовать request.remote_ip ref [this][1] [1]: stackoverflow.com/questions/3887943 /ip-адрес-в-рельсах   -  person Salil    schedule 24.12.2012
comment
@Salil: это всегда будет давать 127.0.0.1 как o/p. Но мне нужен IP-адрес в Интернете, который я получаю для команды «ifconfig». Спасибо.   -  person Rajesh Omanakuttan    schedule 24.12.2012
comment
Также проверьте stackoverflow.com/q/14112955/128421.   -  person the Tin Man    schedule 19.06.2013


Ответы (3)


Используйте Socket::ip_address_list .

Socket.ip_address_list #=> Array of AddrInfo
person Sigurd    schedule 24.12.2012
comment
не могли бы вы предложить, как мы могли бы получить второе значение из массива, который мы получаем, используя Socket.ip_address_list #=> Array of AddrInfo. Я не получаю это обычным способом. Спасибо - person Rajesh Omanakuttan; 24.12.2012
comment
Второй не всегда правильный. У вас может быть несколько разных интерфейсов и петлей. Вы можете использовать следующий код, чтобы отклонить все локальные адреса и открыть первый внешний Socket.ip_address_list.find {|a| a.ipv4? ? !(a.ipv4_private? || a.ipv4_loopback?) : !(a.ipv6_sitelocal? || a.ipv6_linklocal? || a.ipv6_loopback?) } - person Sigurd; 24.12.2012
comment
Что именно не работает? И, пожалуйста, предоставьте свой массив AddrInfo. Может быть, у вашей машины нет удаленного IP-адреса, поэтому вам нужно удалить ipv4_private? и ipv6_sitelocal? из условий, чтобы получить IP локальной подсети. - person Sigurd; 24.12.2012
comment
OP запрашивает локальный IP (при условии IPv4), поэтому: puts Socket.ip_address_list.find { |a| a.ipv4_private? && !a.ipv4_loopback? }.ip_address - person bradw2k; 15.07.2021

Это мой первый способ:

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
    s.addr.last
  end
ensure
  Socket.do_not_reverse_lookup = orig
end

# irb:0> local_ip
# => "192.168.0.127"

Это мой второй способ, который не рекомендуется:

require 'socket'
 Socket::getaddrinfo(Socket.gethostname,”echo”,Socket::AF_INET)[0][3]

Третий способ:

 UDPSocket.open {|s| s.connect('64.233.187.99', 1); s.addr.last }

И четвертый способ:

Use Socket#ip_address_list

Socket.ip_address_list #=> Array of AddrInfo
person SSP    schedule 24.12.2012
comment
не могли бы вы предложить, как мы могли бы получить второе значение из массива, который мы получаем, используя Socket.ip_address_list #=> Array of AddrInfo. Я не получаю это обычным способом. Спасибо - person Rajesh Omanakuttan; 24.12.2012

Напишите ниже метод

def self.local_ip
    orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true
    UDPSocket.open do |s|
      s.connect '64.233.187.99', 1
      s.addr.last
    end
    ensure
      Socket.do_not_reverse_lookup = orig
 end

а затем вызовите метод local_ip, вы получите IP-адрес вашей машины.

Eg: ip_address= local_ip
person Dipali Nagrale    schedule 24.12.2012