Ich bin gerade dabei, eine Ruby on Rails-App zu warten, und suche nach einer einfachen Möglichkeit, den Hostnamen oder die IP-Adresse der Box zu finden, auf der ich mich befinde (da es sich um eine VM handelt und neue Instanzen möglicherweise andere Hostnamen oder IP-Adressen haben). . Gibt es eine schnelle und einfache Möglichkeit, dies in Ruby on Rails zu tun?
Bearbeiten: Die Antwort unten ist korrekt, aber die Klarstellung, die Craig gegeben hat, ist nützlich (siehe auch den bereitgestellten Link in der Antwort):
Der Code [unten] stellt KEINE Verbindung her und sendet keine Pakete (an 64.233.187.99, was Google ist). Da UDP ein zustandsloses Protokoll ist, führt connect () lediglich einen Systemaufruf durch, der herausfindet, wie die Pakete basierend auf der Adresse weitergeleitet werden und an welche Schnittstelle (und damit IP-Adresse) sie gebunden werden soll. addr () gibt ein Array zurück, das die Familie (AF_INET), den lokalen Port und die lokale Adresse (was wir wollen) des Sockets enthält.
quelle
Hostname
Eine einfache Möglichkeit, den Hostnamen in Ruby abzurufen, ist:
Der Haken dabei ist, dass der Host seinen eigenen Namen kennt, da er entweder den Systemaufruf
gethostname
oder denuname
Systemaufruf verwendet, sodass er für das ursprüngliche Problem nicht funktioniert.Funktionell ist dies identisch mit der
hostname
Antwort, ohne ein externes Programm aufzurufen. Der Hostname kann abhängig von der Konfiguration des Computers vollständig qualifiziert sein oder nicht.IP Adresse
Seit Ruby 1.9 können Sie auch die Socket-Bibliothek verwenden, um eine Liste der lokalen Adressen abzurufen. Gibt
ip_address_list
ein Array von AddrInfo- Objekten zurück. Wie Sie auswählen, hängt davon ab, was Sie tun möchten und wie viele Schnittstellen Sie haben. Hier ist ein Beispiel, in dem einfach die erste IPV4-IP-Adresse ohne Loopback als Zeichenfolge ausgewählt wird:quelle
Versuche dies:
quelle
hostname
, dass es funktionieren wird, können Sie es der Einfachheit halber nicht übertreffenuname -n
.sub (/\..*/, '')Ein Server verfügt normalerweise über mehr als eine Schnittstelle, mindestens eine private und eine öffentliche.
Da sich alle Antworten hier mit diesem einfachen Szenario befassen, besteht eine sauberere Möglichkeit darin, Socket nach dem aktuellen
ip_address_list()
Stand zu fragen, wie in:Beide geben ein Addrinfo-Objekt zurück. Wenn Sie also eine Zeichenfolge benötigen, können Sie die
ip_address()
Methode wie folgt verwenden :Sie können leicht die geeignetere Lösung für Ihren Fall finden, indem Sie die Addrinfo-Methoden ändern, mit denen die erforderliche Schnittstellenadresse gefiltert wird.
quelle
Diese hier verwendete IP-Adresse ist die von Google, Sie können jedoch jede zugängliche IP-Adresse verwenden.
quelle
Am einfachsten ist
host_with_port
in controller.rbquelle
Die akzeptierte Antwort funktioniert, aber Sie müssen für jede Anfrage einen Socket erstellen. Dies funktioniert nicht, wenn sich der Server in einem lokalen Netzwerk befindet und / oder nicht mit dem Internet verbunden ist. Ich glaube, dass das Folgende immer funktioniert, da es den Anforderungsheader analysiert.
quelle
Fügen Sie den hervorgehobenen Teil in Backticks ein:
Oder nur,
request.host
wenn es Ihnen egal ist, ob es sich um eine IP handelt oder nicht.quelle
Ähnlich wie bei der Antwort mit
hostname
dem externenuname
Befehl unter UNIX / LINUX:Für die verwendeten IP-Adressen (Ihr Computer kann mehrere Netzwerkschnittstellen haben) können Sie Folgendes verwenden:
quelle
Sie werden wahrscheinlich feststellen, dass auf jedem Computer mehrere IP-Adressen vorhanden sind (127.0.0.1, 192.168.0.1 usw.). Wenn Sie * NIX als Betriebssystem verwenden, würde ich empfehlen
hostname
, einen DNS-Lookup zu verwenden und dann auszuführen. Sie sollten in der Lage sein, mit / etc / hosts den lokalen Hostnamen zu definieren, der in die IP-Adresse für diesen Computer aufgelöst werden soll. Es gibt ähnliche Funktionen unter Windows, aber ich habe sie nicht verwendet, da Windows 95 die neueste Version war.Die andere Möglichkeit wäre, einen Suchdienst wie WhatIsMyIp.com aufzurufen . Diese Jungs werden Ihnen Ihre reale IP-Adresse zurückgeben. Dies können Sie auch einfach mit einem Perl-Skript auf einem lokalen Server einrichten, wenn Sie dies bevorzugen. Ich glaube, dass ungefähr 3 Codezeilen zur Ausgabe der Remote-IP von% ENV Sie abdecken sollten.
quelle
Die paar Antworten mit
require 'socket'
sehen gut aus. Diejenigen mit request.blah_blah_blah gehen davon aus, dass Sie Rails verwenden.IO sollte jederzeit verfügbar sein. Das einzige Problem mit diesem Skript wäre, dass
ifconfig
Sie unterschiedliche Ergebnisse für die IP erhalten , wenn es auf Ihren Systemen in einem anderen Manor ausgegeben wird. Die Suche nach dem Hostnamen sollte fest wie Sears sein.quelle
versuchen Sie: Request.remote_ip
Update: Ups, tut mir leid, ich habe die Dokumentation falsch gelesen.
quelle