Получение имени хоста или IP-адреса в Ruby on Rails

Я занимаюсь поддержкой приложения Ruby on 9X_networking Rails и ищу простой способ найти имя хоста 9X_network или IP-адрес компьютера, на котором я нахожусь 9X_networks (поскольку это виртуальная машина, а новые 9X_ruby экземпляры могут иметь другие имена хостов 9X_networking или IP-адреса). ). Есть ли быстрый и простой 9X_ruby способ сделать это в Ruby on Rails?

Изменить: ответ 9X_networks ниже правильный, но пояснение, предоставленное 9X_ruby Крейгом, полезно (см. Также предоставленную 9X_ruby ссылку в ответе):

Код [ниже] НЕ делает соединение 9X_networks или отправлять какие-либо пакеты (на 64.233.187.99 9X_network (гугл). Поскольку UDP является протоколом 9X_network без сохранения состояния, connect() просто 9X_ruby делает системный вызов, который выясняет, как 9X_networking маршрутизировать пакеты на основании адреса 9X_networking и того, что интерфейс (и, следовательно, IP-адрес) он 9X_networks должен привязываться к. addr() возвращает массив, содержащий 9X_networks семейство (AF_INET), локальный порт и 9X_networks локальный адрес (который это то, что мы 9X_network хотим) сокета.

83
0
11
Общее количество ответов: 11

Ответ #1

Ответ на вопрос: Получение имени хоста или IP-адреса в Ruby on Rails

Имя хоста

Простой способ получить имя хоста в Ruby:

require 'socket' hostname = Socket.gethostname 

Загвоздка 9X_networking в том, что это зависит от того, что хост 9X_ruby знает свое собственное имя, потому что он 9X_networking использует системный вызов gethostname или uname, поэтому 9X_networking он не сработает для исходной проблемы.

Функционально 9X_ruby это идентично ответу hostname, без вызова внешней 9X_networks программы. Имя хоста может быть или не быть 9X_ruby полным, в зависимости от конфигурации машины.


IP-адрес

Начиная 9X_network с Ruby 1.9, вы также можете использовать 9X_networking библиотеку Socket для получения списка локальных 9X_networks адресов. ip_address_list возвращает массив объектов AddrInfo. То, как 9X_network вы выберете из него, будет зависеть от того, что 9X_network вы хотите сделать и сколько интерфейсов 9X_networks у вас есть, но вот пример, который просто 9X_network выбирает первый IP-адрес IPV4 без обратной 9X_networks связи в виде строки:

require 'socket' ip_address = Socket.ip_address_list.find { |ai| ai.ipv4? && !ai.ipv4_loopback? }.ip_address 

141
0

Ответ #2

Ответ на вопрос: Получение имени хоста или IP-адреса в Ruby on Rails

От coderrr.wordpress.com:

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" 

9X_networks

51
1

  • @ user422543 Согласно редактировани ...

Ответ #3

Ответ на вопрос: Получение имени хоста или IP-адреса в Ruby on Rails

Попробуйте это:

host = `hostname`.strip # Get the hostname from the shell and removing trailing \n puts host # Output the hostname 

9X_ruby

26
1

  • Мне нравится Socket.gethostname из-за чистоты, но для простого поиска в системе, где вы знае ...

Ответ #4

Ответ на вопрос: Получение имени хоста или IP-адреса в Ruby on Rails

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

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

Оба возвращают 9X_network объект Addrinfo, поэтому, если вам нужна 9X_networking строка, вы можете использовать метод ip_address(), например:

ip= my_first_public_ipv4.ip_address unless my_first_public_ipv4.nil? 

Вы 9X_networks можете легко найти более подходящее решение 9X_networks для вашего случая, изменив методы Addrinfo, используемые 9X_ruby для фильтрации требуемого адреса интерфейса.

13
0

Ответ #5

Ответ на вопрос: Получение имени хоста или IP-адреса в Ruby on Rails

Самый простой - это host_with_port в controller.rb

host_port= request.host_with_port 

9X_networks

10
1

  • Обратной стороной является то, что вы должны быть в контроллере, чтобы получить доступ к запросу .. но хорош ...

Ответ #6

Ответ на вопрос: Получение имени хоста или IP-адреса в Ruby on Rails

Используемый здесь IP-адрес принадлежит 9X_network Google, но вы можете использовать любой 9X_networks доступный IP-адрес.

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

9
0

Ответ #7

Ответ на вопрос: Получение имени хоста или IP-адреса в Ruby on Rails

Аналогично ответу с использованием hostname с использованием 9X_networking внешней команды uname в UNIX / LINUX:

hostname = `uname -n`.chomp.sub(/\..*/,'') # stripping off "\n" and the network name if present 

для используемых 9X_networking IP-адресов (на вашем компьютере может быть 9X_network несколько сетевых интерфейсов), вы можете 9X_network использовать что-то вроде этого:

 # on a Mac: ip_addresses = `ifconfig | grep 'inet ' | grep -v 127.0.0.1 | cut -d' ' -f 2`.split => ['10.2.21.122','10.8.122.12'] # on Linux: ip_addresses = `ifconfig -a | grep 'inet ' | grep -v 127.0.0.1 | cut -d':' -f 2 | cut -d' ' -f 1`.split => ['10.2.21.122','10.8.122.12'] 

3
0

Ответ #8

Ответ на вопрос: Получение имени хоста или IP-адреса в Ruby on Rails

Поместите выделенную часть в обратные кавычки:

`dig #{request.host} +short`.strip # dig gives a newline at the end 

Или 9X_network просто request.host, если вам все равно, IP это или 9X_network нет.

2
0

Ответ #9

Ответ на вопрос: Получение имени хоста или IP-адреса в Ruby on Rails

Принятый ответ работает, но вы должны создавать 9X_network сокет для каждого запроса, и он не будет 9X_network работать, если сервер находится в локальной 9X_networking сети и / или не подключен к Интернету. Я 9X_networks считаю, что приведенное ниже всегда будет 9X_ruby работать, поскольку оно анализирует заголовок 9X_networks запроса.

request.env["SERVER_ADDR"] 

2
1

  • OP на самом деле не сказал, что у них есть доступ к объекту запроса в точке, ...

Ответ #10

Ответ на вопрос: Получение имени хоста или IP-адреса в Ruby on Rails

Скорее всего, у вас будет несколько IP-адресов 9X_networking на каждой машине (127.0.0.1, 192.168.0.1 9X_networks и т. д.). Если вы используете *NIX в качестве 9X_networks вашей ОС, я бы предложил использовать hostname, а 9X_networks затем выполнить поиск DNS для этого. Вы 9X_network должны иметь возможность использовать /etc/hosts 9X_networks для определения локального имени хоста, которое 9X_networks будет преобразовано в IP-адрес этой машины. Аналогичная 9X_networking функциональность есть и в Windows, но я 9X_network ею не пользовался, так как Windows 95 была 9X_networking самой передовой.

Другой вариант — воспользоваться 9X_network сервисом поиска, например WhatIsMyIp.com. Эти ребята вернут 9X_networks вам ваш реальный IP-адрес. Это также то, что 9X_network вы можете легко настроить с помощью скрипта 9X_networks Perl на локальном сервере, если хотите. Я 9X_networks считаю, что 3 строки или около того кода 9X_networking для вывода удаленного IP-адреса из %ENV 9X_networking должны охватывать вас.

1
0

Ответ #11

Ответ на вопрос: Получение имени хоста или IP-адреса в Ruby on Rails

io = IO.popen('hostname') hostname = io.readlines io = IO.popen('ifconfig') ifconfig = io.readlines ip = ifconfig[11].scan(/\ \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\ /) 
Пара ответов с require 'socket' выглядит хорошо. Те, у кого 9X_networking есть request.blah_blah_blah предположим, что 9X_networks вы используете Rails.
Операции ввода-вывода 9X_networking должны быть доступны постоянно. Единственная 9X_networking проблема с этим сценарием заключается в 9X_networks том, что если ifconfig выводится в другом поместье 9X_ruby в ваших системах, вы получите разные результаты 9X_network для IP. Поиск имени хоста должен быть твердым, как 9X_network Sears.
1
0