IP-Adressen in Hostnamen wandeln (Perl)
Thomas Adamek
Hallo,
im Internet habe ich schon fieberhaft danach gesucht, bin aber leider nicht fündig geworden.
Für ein Zählerstatistikscript suche ich eine Perl-Routine, die mir eine IP-Adresse in den Hostnamen
umwandelt. Die Environment-Variable REMOTE_HOST ist da leider nicht zuverlässig genug und enthält
bei mir nur in den seltensten Fällen auch den Hostnamen.
Eine Funktion zum Resolven gibt es dafür leider nicht, aber man kann ein Shell-Kommando mit folgender
Befehlssequenz ausführen:
$nslookupcmd = "/usr/bin/nslookup";
$ipaddress = $ENV{'REMOTE_ADDR'};
open (CMD, "|$nslookupcmd $ipaddress");
close CMD;
Bloß, wie komme ich an die Ausgabe des Kommandos heran?
Leider bin ich noch nicht ganz so Perl-erfahren. Weiß jemand vielleicht eine Lösung für dieses Problem?
Vielen Dank schon mal
Gruß
Thomas
Hallo Thomas,
Bloß, wie komme ich an die Ausgabe des Kommandos heran?
Leider kenne ich mich mit diesen Shell-Befehlen nicht so aus, aber ich nehme an, nslookup schreibt seinen Output wie jedes Unix-Dienstprogramm auf stdout. Dann ist es aber auch moeglich, als Aufrufparameter eine Umleitung mit anzugeben. So koennte man die Ausgabe beispielsweise in eine Textdatei umleiten, die das Perl-Script anschliessend auslesen kann. Etwa so:
open (CMD, "|$nslookupcmd $ipaddress > temp.txt");
Keine Ahnung, ob das so funktioniert. Aber wenn, koennte das Perl-Script hinterher einfach temp.txt oeffnen und den Inhalt auslesen.
Viele Gruesse
Stefan Muenz
Hallo Stefan,
Dann ist es aber auch moeglich, als Aufrufparameter eine Umleitung mit anzugeben. So koennte man die Ausgabe beispielsweise in eine Textdatei umleiten, die das Perl-Script anschliessend auslesen kann. Etwa so:
open (CMD, "|$nslookupcmd $ipaddress > temp.txt");
Danke für den Tip. Ich habe ein Script gefunden, das genau das macht, aber ein wenig anders, beim Testen stellte ich aber fest, daß es das leider nicht tut, es passiert nichts, $name ist immer leer und daher wird immer "unknown" zurückgegeben. Weiß jemand, woran das liegen kann?
Am Prompt wird die Adresse 195.211.211.20 z.B. korrekt in proxy.ipf.net aufgelöst, wenn ich nslookup direkt aufrufe.
Hier das Script ($nslookupcmd zeigt auf /usr/bin/nslookup auf meiner Maschine):
sub resolve_host {
$hostname = $ENV{'REMOTE\_HOST'};
# Wenn IP-Adresse zurückgeliefert wurde, NSLookup ausführen
if ($hostname =~ /^d\*/)
{
open(NS,"$nslookupcmd $hostname |grep Name: |");
while(<NS>)
{
($dummy,$name)=split(/: /);
}
close (NS);
if ($name eq '')
{
$name='unknown';
}
else
{
chop($name);
}
$hostname=$name;
}
}
Was macht eigentlich das "chop"-Kommando? :-((
Gruß
Thomas
Hallo Thomas,
ich bin zwar auch nicht der ultimative Experte, aber zwei mögliche Fehler sind mir hier aufgefallen:
Hier das Script ($nslookupcmd zeigt auf /usr/bin/nslookup auf meiner Maschine):
sub resolve_host {
»» $hostname = $ENV{'REMOTE_HOST'};
»» # Wenn IP-Adresse zurückgeliefert wurde, NSLookup ausführen
»»
»» if ($hostname =~ /^d*/)
»» {
open(NS,"$nslookupcmd $hostname |grep Name: |");
Was soll "grep Name: |" bewirken? M.E. muesste auch
open(NS,"$nslookupcmd $hostname |");
funktionieren.
while(<NS>)
{
($dummy,$name)=split(/: /);
Falls die Leerzeichen auch im original-Script stehen, solltes Du sie loeschen, sonst wird der Doppelpunkt nicht gefunden.
($dummy,$name)=split(/:/);
}
close (NS);if ($name eq '')
{
$name='unknown';
}
else
{
chop($name);
}
$hostname=$name;
}
}Was macht eigentlich das "chop"-Kommando? :-((
Chop() löscht das letzte Zeichen eines Skalars weg. Chomp() löscht nur ein Zeilenumbruch am Ende eines Skalars weg und wäre hier der Deutlichkeit halber vielleicht angebrachter.
Gruß, Christian.
Gruß
Thomas
Hallo Christian,
ich bin zwar auch nicht der ultimative Experte, aber zwei mögliche Fehler sind mir hier aufgefallen:
Danke für Deine Antwort. Ich habe jetzt ein anderes Script gefunden, was die Aufgabe auf andere Weise perfekt löst, es arbeitet mit einer Funktion gethostbyname() und ist etwas sauberer und auch schneller. Trotzdem danke ... so langsam fange ich an, Perl ein wenig zu begreifen ;-)
Gruß
Thomas