Gibt es eine saubere und betriebssystemunabhängige Möglichkeit, die IP-Adressen der lokalen Maschine von Perl aus zu bestimmen?
Bisher habe ich folgende Lösungen gefunden:
analysiert die Ausgabe von ifconfig und ipconfig (hart, verschiedene Windows-Versionen haben unterschiedliche ipconfig-Ausgaben)
stelle eine Netzwerkverbindung zu einer bekannten IP-Adresse her und untersuche die lokale IP-Adresse des Sockets (funktioniert nicht, wenn ich keine Verbindung herstellen kann und nur eine IP-Adresse ermitteln kann)
Irgendwelche besseren Vorschläge?
Net :: Address :: IP :: Local sieht vielversprechend aus.
%Vor%Sie haben auch einige andere Optionen , einschließlich Ihrer Lösung zum Aufbau einer Netzwerkverbindung zu einer bekannten IP-Adresse und untersuchen Sie die lokale IP-Adresse des Sockets ".
In diesem Fall (Aufbau der Netzwerkverbindung) weist dieser Artikel jedoch darauf hin:
Es gibt keine IP-Adresse eines Hosts.
Netzwerkschnittstellen haben IP-Adressen, keine Hosts und eine einzelne Netzwerkschnittstelle kann viele (virtuelle) IP-Adressen haben. Das Routing-Subsystem des Betriebssystems entscheidet, welche Netzwerkschnittstelle und IP-Adresse für die Verbindung mit einem Remote-Computer verwendet werden soll.Wenn Ihr Computer nur über eine externe Netzwerkschnittstelle verfügt und diese Schnittstelle nur eine IP-Adresse hat, wird diese IP-Adresse häufig als die Adresse der Maschine bezeichnet, aber das ist ungenau.
Wenn der Computer beispielsweise über eine virtuelle Schnittstelle mit einem VPN verbunden ist, verwendet er die IP-Adresse dieser Schnittstelle, um eine Verbindung zu einem anderen Computer im VPN herzustellen, nicht die externe IP-Adresse
Unter den anderen Lösungen: verwendet " Sys::Hostname
"
(Funktioniert, wenn Sys::Hostname
einen auflösbaren Hostnamen enthält)
In meinem Fall brauche ich eine Lösung ohne Abhängigkeiten, die nicht vom Kern abhängen. Ich kam nach dem Studium des Codes in Net :: Address :: IP :: Local:
%Vor% get_local_ip_address()
sollte die gleiche Zeichenfolge wie Net::Address::IP::Local->public_ipv4
zurückgeben.
Falls gewünscht, können Sie das Attribut PeerAddr
(in den Argumenten für den Konstruktor für IO :: Socket :: INET) zu einem lokalen DNS-Server ändern.
Um die IP-Adresse von all -Schnittstellen abzurufen, verwenden Sie IO :: Interface :: Einfach :
%Vor% Wenn Sie nicht an 127.0.0.1 (Loopback) interessiert sind, können Sie auf $_->is_loopback
filtern.
Perldoc hat eine Beantworten Sie diese Frage in ihren FAQ (" perlfaq9 ") - Verwenden Sie verschiedene Module (die Teile der Standard Library sind) oder sogar eine eingebaute Funktion.
Ich hatte mit IO :: Interface unter Linux und Solaris gute Erfolge, und ich denke es hat sogar an AIX gearbeitet, aber ich kann mich nicht sicher erinnern. Wenn man auf den verschiedenen Seiten von search.cpan.org, rt.cpan.org und ActiveState herumstochert, sieht es so aus, als würde IO :: Interface unter Windows Build-Probleme bekommen. Ich denke, der einzige Weg zu wissen, ob es verfügbar ist, ist die Suche nach io-Schnittstelle in PPM.
Verwenden Sie WMI?
Beispiel für das Extrahieren von IP-Adressen (in Powershell, aber es ist ziemlich klar, was passiert)
>Beispiel für den Zugriff auf WMI von Perl (nicht die gleichen WMI-Funktionen, aber wieder ist der Prozess einigermaßen klar)
EDIT: nach einer Suche in Google-Codesearch für Netzwerkadapterkonfiguration und Sprache "perl":
Beispiel sieht ungefähr so aus, wie Sie es brauchen
EDIT2: Tatsächlich scheint der OCS-Code Code für die meisten Plattformen zu enthalten, also kann es sein, dass es keinen Code gibt, der das tut, aber vielleicht können Sie seine Ideen wiederverwenden. Es ist aber GPL.
Beispiel: hier ist der Solaris-Code . Andere Bits umfassen BSD, Linux, MacOS ...
für Windows verwende ich
%Vor%Die erste Zeile beginnend mit 0.0.0.0 ist das Standard-Gateway. Es gibt vielleicht mehrere Gateways. Zeilen, die mit 255.255.255.255 beginnen, sind ebenfalls nützlich. netstat -r und route print sind gleich.
Kann für OSX angepasst werden, Linux nicht so hilfreich.
Tags und Links perl networking