it-swarm.com.de

Wie erhalte ich die IP-Adresse meines Geräts von Ruby, ohne von einer anderen IP-Adresse Gebrauch zu machen?

Ich habe überall gesucht, aber ihre Lösung erfordert eine IP-Adresse ... Hier sind die Lösungen, die ich gefunden habe.

    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

Alle benötigen eine IP-Adresse von jemandem. Gibt es eine Lösung, die die IP-Adresse einer anderen Person nicht verwendet? Vorzugsweise plattformunabhängig.

22
user1535147

Ist nicht die Lösung, nach der Sie suchen:

require 'socket'

addr_infos = Socket.ip_address_list

Da ein Computer mehrere Schnittstellen und mehrere IP-Adressen haben kann, gibt diese Methode ein Array von Addrinfo zurück.

Sie können die genauen IP-Adressen wie folgt abrufen:

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

P.S. Die Frage ist ein bisschen alt, erscheint aber als erstes bei Google und enthält nicht die Lösung, nach der die meisten Leute suchen, also habe ich beschlossen, sie zu posten.

Ich hoffe es hilft.

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

ganz wie Methode 1 eigentlich 

15
Eugene Rourke

Das ist, was ich seit Jahren in der Produktion verwende:

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

Funktioniert super; getestet auf aws und klassisches Hosting 

12
fuzzygroup

Da es keine Standard-IP-Schnittstelle für einen Host gibt (es muss überhaupt keine IP-Schnittstelle vorhanden sein), sind alle Annahmen bezüglich der Benennung ungenau und müssen nicht unbedingt erfüllt werden.

Der von gethostname() zurückgegebene Wert kann unabhängig von jedem IP-Setup definiert werden. Daher muss kein gültiger Host in Form eines Hostnamens angegeben werden, der in eine beliebige IP-Adresse aufgelöst werden könnte.

Aus Sicht des POSIX-Systems ist die einzige Funktion, die die Verfügbarkeit von (ip-) Schnittstellen überprüft, die Funktion getifaddrs(), die eine Liste aller Schnittstellen mit ihren Parametern zurückgibt.

Da es so aussieht, als ob Rubys aktuelles Socket lib keine Schnittstelle dafür bietet, scheint this (http://rubygems.org/gems/system-getifaddrs) ein gem-basierter Ansatz der einzige Weg zu sein gehen.

1
alk

die Ausgabe des ip-Befehls parsen?

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

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

oder parsen Sie die Ausgabe des ipconfig-Befehls: https://stackoverflow.com/a/12632929/32453

0
rogerdpack