Thomas Adamek: IP-Adressen in Hostnamen wandeln (Perl)

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";

IP-Adresse auslesen

$ipaddress = $ENV{'REMOTE_ADDR'};

NS-Lookup-Kommando ausführen

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

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

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

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

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