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.
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.
require 'socket'
Socket::getaddrinfo(Socket.gethostname,"echo",Socket::AF_INET)[0][3]
tout à fait comme la méthode 1, en fait
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
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.
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