Получение имени хоста или 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 хотим) сокета.
Ответ #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
Ответ #2
Ответ на вопрос: Получение имени хоста или IP-адреса в Ruby on Rails
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
- @ 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
- Мне нравится 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 для фильтрации требуемого адреса интерфейса.
Ответ #5
Ответ на вопрос: Получение имени хоста или IP-адреса в Ruby on Rails
- Обратной стороной является то, что вы должны быть в контроллере, чтобы получить доступ к запросу .. но хорош ...
Ответ #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}
Ответ #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']
Ответ #8
Ответ на вопрос: Получение имени хоста или IP-адреса в Ruby on Rails
Поместите выделенную часть в обратные кавычки:
`dig #{request.host} +short`.strip # dig gives a newline at the end
Или 9X_network просто request.host
, если вам все равно, IP это или 9X_network нет.
Ответ #9
Ответ на вопрос: Получение имени хоста или IP-адреса в Ruby on Rails
Принятый ответ работает, но вы должны создавать 9X_network сокет для каждого запроса, и он не будет 9X_network работать, если сервер находится в локальной 9X_networking сети и / или не подключен к Интернету. Я 9X_networks считаю, что приведенное ниже всегда будет 9X_ruby работать, поскольку оно анализирует заголовок 9X_networks запроса.
request.env["SERVER_ADDR"]
- 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 должны охватывать вас.
Ответ #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.
-
8
-
2
-
14
-
34
-
21
-
7
-
10
-
3
-
9
-
14
-
10
-
5
-
1
-
8
-
8
-
8
-
6
-
3
-
32
-
11
-
36
-
6
-
5
-
7
-
10
-
7
-
10
-
1
-
4
-
10
-
3
-
10
-
10
-
6
-
9
-
7
-
5
-
8
-
6
-
7
-
2
-
7
-
4
-
13
-
10
-
6
-
4
-
3
-
4
-
11