Как получить 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-адрес? Предпочтительно, независимая от платформы.
Ответы
Ответ 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, кажется чтобы быть единственным способом.
Ответ 5
проанализировать вывод команды ip
?
from https://gist.github.com/henriquemenezes/a99f13da957515023e78aea30d6c0a48
gw = `ip route show`[/default.*/][/\d+\.\d+\.\d+\.\d+/]
или проанализировать вывод команды ipconfig
: fooobar.com/info/75782/...