88 votes

Obtenir le nom d'hôte ou l'IP en Ruby on Rails

Je suis en train de maintenir une application Ruby on Rails et je cherche un moyen facile de trouver le nom d'hôte ou l'adresse IP de la machine sur laquelle je me trouve (puisqu'il s'agit d'une VM et que les nouvelles instances peuvent avoir des noms d'hôte ou des adresses IP différents). Existe-t-il un moyen simple et rapide de faire cela en Ruby on Rails ?

Edit : La réponse ci-dessous est correcte mais la clarification fournie par Craig est utile (voir également le lien fourni dans la réponse) :

Le code [ci-dessous] ne fait PAS un ou n'envoie pas de paquets (à 64.233.187.99 qui est google). Puisque UDP est un protocole sans état, connect() effectue simplement un appel système qui détermine comment acheminer les paquets en fonction de l'adresse et de l'interface interface (et donc l'adresse IP) IP). addr() renvoie un tableau contenant la famille tableau contenant la famille (AF_INET), le port local, et l'adresse locale (qui ce que nous voulons) de la socket.

148voto

Tim Peters Points 1622

Nom d'hôte

Une façon simple d'obtenir le nom d'hôte en Ruby est la suivante :

require 'socket'
hostname = Socket.gethostname

Le problème, c'est qu'il faut que l'hôte connaisse son propre nom, car il utilise l'un ou l'autre des éléments suivants gethostname o uname l'appel système, donc cela ne fonctionnera pas pour le problème original.

D'un point de vue fonctionnel, il est identique au hostname réponse, sans invoquer un programme externe. Le nom d'hôte peut ou non être entièrement qualifié, en fonction de la configuration de la machine.


Adresse IP

Depuis ruby 1.9, vous pouvez également utiliser la bibliothèque Socket pour obtenir une liste d'adresses locales. ip_address_list renvoie un tableau de AddrInfo objets. La façon dont vous faites votre choix dépend de ce que vous voulez faire et du nombre d'interfaces que vous avez, mais voici un exemple qui sélectionne simplement la première adresse IPV4 non-boucle sous forme de chaîne :

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

51voto

titanous Points 1601

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

25voto

John Topley Points 58789

Essayez ça :

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

13voto

Claudio Floreani Points 516

Un serveur possède généralement plus d'une interface, au moins une privée et une publique.

Puisque toutes les réponses ici traitent de ce scénario simple, une manière plus propre est de demander à Socket l'adresse actuelle de l'utilisateur. ip_address_list() comme dans :

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

Les deux renvoient un objet Addrinfo, donc si vous avez besoin d'une chaîne de caractères, vous pouvez utiliser la fonction ip_address() comme dans :

ip= my_first_public_ipv4.ip_address unless my_first_public_ipv4.nil?

Vous pouvez facilement trouver la solution la plus adaptée à votre cas en modifiant les méthodes Addrinfo utilisées pour filtrer l'adresse de l'interface requise.

9voto

D-D-Doug Points 445

L'adresse IP utilisée ici est celle de Google, mais vous pouvez utiliser n'importe quelle IP accessible.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X