Pregunta

Estoy en el proceso de mantenimiento de un Ruby on Rails app y estoy buscando una manera fácil de encontrar el nombre de host o la dirección IP de la caja estoy en (ya que es una máquina virtual y las nuevas instancias pueden tener diferentes nombres de host o direcciones IP).Es allí una manera rápida y fácil para hacer esto en Ruby on Rails?

Editar:La respuesta es correcta pero la aclaración Craig siempre es útil (véase también el enlace que se proporciona en la respuesta):

El [abajo] código NO hacer un conexión o enviar cualquier paquete (a 64.233.187.99 que es de google).Dado que UDP es un protocolo sin estado connect() simplemente hace una llamada al sistema que descubre cómo enrutar los paquetes basado en la dirección y lo que interfaz (y por lo tanto de la dirección IP) se debe enlazar.addr() devuelve un matriz que contiene la familia (AF_INET), puerto local, y la dirección local (que es lo que queremos) de la toma de corriente.

¿Fue útil?

Solución

De 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"

Otros consejos

Nombre de host

Una forma sencilla de obtener el nombre de host en Ruby es:

require 'socket'
hostname = Socket.gethostname

El problema es que esto se basa en el host de conocer su propio nombre, ya que utiliza la gethostname o uname llamada al sistema, por lo que no va a funcionar para el problema original.

Funcionalmente este es idéntica a la hostname la respuesta, sin recurrir a un programa externo.El nombre de host puede o no puede estar completo, dependiendo de la configuración de la máquina.


Dirección IP

Desde ruby 1.9, también puede utilizar el Zócalo de la biblioteca para obtener una lista de direcciones locales. ip_address_list devuelve una matriz de AddrInfo objetos.Cómo elegir va a depender de lo que quieras hacer y cuántas interfaces tiene, pero este es un ejemplo que simplemente selecciona el primer no-loopback dirección IP IPV4 como una cadena:

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

Intente esto:

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

Un servidor normalmente tiene más de una interfaz, al menos, una privada y una pública.

Ya que todas las respuestas aquí lidiar con este escenario simple, de un modo limpio es pedir el Socket para el actual ip_address_list() como en:

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

Ambas devuelven un Addrinfo objeto, así que si usted necesita una cadena, se puede utilizar el ip_address() el método, como en:

ip= my_first_public_ipv4.ip_address unless my_first_public_ipv4.nil?

Usted puede fácilmente averiguar la solución más adecuada a su caso el cambio de la Addrinfo métodos utilizados para filtrar el requerido la dirección de la interfaz.

Esta dirección IP se utiliza aquí es el de Google, pero se puede utilizar cualquier IP accesible.

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

Más simple es host_with_port en el controlador.rb

host_port= request.host_with_port

El aceptó responder funciona, pero tienes que crear un socket para cada solicitud y no funciona si el servidor está en una red local y/o no está conectado a internet.El de abajo, yo creo que siempre va a funcionar, ya que es analizar el encabezado de la solicitud.

request.env["SERVER_ADDR"]

Poner la parte resaltada en comillas simples inclinadas:

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

O simplemente request.host si a usted no le importa si es una IP o no.

Similar a la respuesta usando hostname, utilizando el exterior uname comando en UNIX/LINUX:

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

para las direcciones IP en uso (su máquina podría tener múltiples interfaces de red), usted podría usar algo como esto:

 # 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']

Usted probablemente se encontrará con varias direcciones IP de cada máquina (127.0.0.1, 192.168.0.1, etc).Si usted está utilizando *NIX como su sistema operativo, me gustaría sugerir el uso de hostname, y , a continuación, ejecuta una mirada DNS en eso.Usted debe ser capaz de utilizar /etc/hosts para definir el nombre de host local para resolver la dirección IP de la máquina.Hay una funcionalidad similar en Windows, pero no lo he utilizado desde Windows 95 fue al filo de.

La otra opción sería la de golpear a un servicio de búsqueda como WhatIsMyIp.com.Estos chicos que le saque de la espalda de su mundo real en la dirección IP.Esto es algo que también se puede configurar fácilmente con un script de Perl en un servidor local, si lo prefiere.Yo creo que 3 líneas de código a la salida de la IP remota de %ENV debe cubrir.

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}\ /)

El par de respuestas con require 'socket' se ven bien.Con la solicitud.blah_blah_blah suponga que usted está usando Rails.

IO debe estar disponible todo el tiempo.El único problema con este script podría ser que si ifconfig es el resultado de una manera diferente en su sistema, entonces usted podría tener resultados diferentes para la IP.El nombre de host buscar debe ser sólido como Sears.

probar: Solicitud.remote_ip

remote_ip()

Determinar la dirección IP de origen.REMOTE_ADDR es el estándar, pero fallar si el usuario está detrás de un proxy.HTTP_CLIENT_IP y/o HTTP_X_FORWARDED_FOR son establecidos por los proxies para comprobar si estas REMOTE_ADDR es un proxy.HTTP_X_FORWARDED_FOR puede ser delimitado por comas lista en el caso de varios encadenados proxys;la última dirección que no es de confianza es la IP de origen.

Actualización:Oops, lo siento no entendí la documentación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top