Подтвердить что ты не робот

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

Я искал всюду, но их решение требует определенного IP-адреса. Вот решения, которые я нашел.

    require 'socket'
#METHOD 1
    ip = IPSocket.getaddress(Socket.gethostname)
    puts ip 

#METHOD 2
    host = Socket.gethostname
    puts host

#METHOD 3(uses Google address)
    ip = UDPSocket.open {|s| s.connect("64.233.187.99", 1); s.addr.last}
    puts ip

#METHOD 4(uses gateway address)
    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 '192.168.1.1', 1
        s.addr.last
      end
    ensure
      Socket.do_not_reverse_lookup = orig
    end

    ip=local_ip
    puts ip

Для каждого из них требуется IP-адрес. Есть ли решение, которое не использует другой IP-адрес? Предпочтительно, независимая от платформы.

4b9b3361

Ответ 1

Не решение, которое вы ищете просто:

require 'socket'

addr_infos = Socket.ip_address_list

Так как машина может иметь несколько интерфейсов и несколько IP-адресов, этот метод возвращает массив Addrinfo.

Вы можете получить точные IP-адреса, как это:

addr_infos.each do |addr_info|
  puts addr_info.ip_address
end

P.S. Вопрос немного стар, но появляется как первый элемент в Google, и он не содержит решение, которое большинство людей ищут, поэтому я решил опубликовать его.

Надеюсь, что это поможет.

Ответ 2

Это то, что я использовал в производстве в течение многих лет:

require 'socket'
ip = Socket.ip_address_list.detect{|intf| intf.ipv4_private?}
ip.ip_address

Отлично работает; проверено на aws и классическом хостинге

Ответ 3

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

как метод 1, фактически

Ответ 4

Поскольку для хоста нет такой вещи, как ip-интерфейс по умолчанию (вообще нет никакого ip-интерфейса), все предположения относительно имени являются неопределенными, не обязательно сохраняются.

Значение, возвращаемое gethostname(), может быть независимо определено для любой ip-установки, поэтому ему не нужно отображать действительный хост в терминах имени хоста, которое может быть разрешено для любого ip-адреса.

Из представления API системы POSIX единственной функцией reliabe для проверки доступности (ip-) интерфейсов является функция getifaddrs(), которая возвращает список всех интерфейсов вместе со своими параметрами.

Похоже, что Ruby current Socket lib не предоставляет ему интерфейс, этот (http://rubygems.org/gems/system-getifaddrs) подход, основанный на gem, кажется чтобы быть единственным способом.