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

Разработвам Rails в Ubuntu 12.04LTS OS.

Искам да заснема своя локален 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-address-in-rails   -  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 #=› Масив от AddrInfo. Не получавам това по нормален начин. Благодаря - person Rajesh Omanakuttan; 24.12.2012
comment
Второто не винаги е подходящо. Може да имате редица различни интерфейси и loopbacks. Можете да използвате следния код, за да отхвърлите всички локални адреси и да изложите първия външен 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 #=› Масив от 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