web-dev-qa-db-fra.com

Comment obtenir l'adresse IP de ma machine auprès de Ruby sans tirer parti d'une autre adresse IP?

J'ai cherché partout mais leur solution nécessite une certaine forme d'adresse IP . Voici les solutions que j'ai trouvées.

    require 'socket'
#METHOD 1
    ip = IPSocket.getaddress(Socket.gethostname)
    puts ip 

#METHOD 2
    Host = Socket.gethostname
    puts Host

#METHOD 3(uses Google's 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

Tous ont besoin de l'adresse IP de quelqu'un. Existe-t-il une solution qui n'utilise pas l'adresse IP de quelqu'un d'autre? De préférence, plate-forme indépendante.

22
user1535147

La solution que vous recherchez n’est-elle pas simplement:

require 'socket'

addr_infos = Socket.ip_address_list

Puisqu'une machine peut avoir plusieurs interfaces et plusieurs adresses IP, cette méthode retourne un tableau de Addrinfo .

Vous pouvez récupérer les adresses IP exactes comme ceci:

addr_infos.each do |addr_info|
  puts addr_info.ip_address
end

P.S. La question est un peu ancienne, mais apparaît comme le premier élément de Google et ne contient pas la solution recherchée par la plupart des internautes. J'ai donc décidé de la publier.

J'espère que ça aide.

36
Itay Grudev
require 'socket'
Socket::getaddrinfo(Socket.gethostname,"echo",Socket::AF_INET)[0][3]

tout à fait comme la méthode 1, en fait 

15
Eugene Rourke

C'est ce que j'utilise en production depuis des années:

require 'socket'
require 'resolv-replace'
ip = Socket.ip_address_list.detect{|intf| intf.ipv4_private?}
ip.ip_address

Fonctionne très bien; testé sur aws et hébergement classique 

12
fuzzygroup

Comme il n’existe pas d’interface ip par défaut avec un hôte (il n’est pas nécessaire d’être une interface ip du tout), toutes les hypothèses concernant la dénomination sont vagues et ne sont pas nécessairement valables.

La valeur renvoyée par gethostname() peut être définie indépendamment de toute configuration ip. Il n'est donc pas nécessaire de refléter un hôte valide en termes de nom d'hôte pouvant être résolu en une adresse IP quelconque.

Du point de vue de l'API du système POSIX, la seule fonction fiable permettant de tester la disponibilité des interfaces (ip) est la fonction getifaddrs(), qui renvoie une liste de toutes les interfaces avec leurs paramètres.

Comme il semble que l'actuel Socket lib de Ruby ne fournisse pas d'interface, cette approche (http://rubygems.org/gems/system-getifaddrs) gem semble être la seule solution.

1
alk

analyser la sortie de la commande ip?

de https://Gist.github.com/henriquemenezes/a99f13da957515023e78aea30d6c0a48

gw = `ip route show`[/default.*/][/\d+\.\d+\.\d+\.\d+/]

ou analysez le résultat de la commande ipconfig: https://stackoverflow.com/a/12632929/32453

0
rogerdpack