Wie kann ich die IP-Adressen der lokalen Maschine von Perl aus ermitteln?

8

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?

    
Zizzencs 01.12.2008, 10:27
quelle

11 Antworten

15

Net :: Address :: IP :: Local sieht vielversprechend aus.

%Vor%     
Leon Timmermans 01.12.2008, 12:13
quelle
13

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)

%Vor%     
VonC 01.12.2008 11:24
quelle
13

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.

    
Tommy Stanton 14.08.2012 14:47
quelle
5

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.

    
dolmen 10.09.2012 14:52
quelle
2

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.

    
evgeny9 09.11.2011 09:47
quelle
1

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.

    
converter42 01.12.2008 16:16
quelle
0

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 ...

    
The Archetypal Paul 01.12.2008 10:44
quelle
0

Net :: Address :: IP :: Local funktioniert gut, aber da das ursprüngliche Poster nach allen lokalen Adressen fragt, denke ich, dass dieses besser ist:

Ссылка

Es hat mit ActivePerl für Windows XP gut funktioniert.

    
golimar 15.11.2011 15:16
quelle
0

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.

    
Matt 25.02.2014 19:32
quelle
0

Ich habe eine Kombination dieser Linux-Befehle verwendet, also keine Abhängigkeit von einem Perl-Modul.

%Vor%     
Hariboo 29.01.2017 08:01
quelle

Tags und Links