Airwolf89: IP-Liste filtern

Hi Leut's,

ich habe nen problem: Ich habe ein Script in Perl, das erstellt mir eine Tabelle mit vielen IPs, Mac-Addressen usw. Nun möchte ich dass bestimmte IPs gefiltert und nicht angezeigt werden.

Der dafür wichtige Teil ist der hier:

  
if (($SiteName) && ($SiteIP))  
  {  
  $ipblock = new Net::Netmask ($SiteIP);  
  
  @IP=$ipblock->enumerate();  
  
  $IPLIST=`sudo /usr/bin/fping -a -A -i 10 -p 100 -r 1 @IP | grep -v "<-"`;  
  
  @ALIVEIPS= split(/\n/, $IPLIST);  
  
    foreach $ThisIP (@ALIVEIPS)  
        {  
  
        if (=!!= Hier soll die Bedingung rein =!!=)  
        {  
        print "<tr><td><a href=\"http:\/\/$ThisIP\">$ThisIP<\/a><\/td>";  

Die IP wird dann immer wie gewohnt im Format xxx.xxx.xxx.xxx ausgegeben. Ziel ist es alle IPs die alle die ersten 3 Blöcke gleich haben und sich nur im letzten Block unterscheiden. also als Beispiel: 192.168.123.1 bis 192.168.123.50 sollen nicht mehr angezeigt werden. Alle anderen schon.

Wie muss ich jetzt die Bedingung formulieren? Kann man das mit RegExpressions machen? Geht das überhaupt so wie ich das will?

Danke im voraus.

  1. OK,

    habe mir jetzt mal ne Bedingung zusammengeschrieben, die sieht so aus, habe noch nicht getestet ob das so funktioniert, auf jeden Fall fände ich es schöner wenn es eine etwas elegantere Lösung dazu gäbe.

      
    if (  
         ( ($SiteIP == xxx.xxx.24.0) && ($ThisIP  !xxx.xxx.24./[1-50]) ) ||  
         ( ($SiteIP == xxx.xxx.4.0) && ($ThisIP  !xxx.xxx.4./[1-50]) ) ||  
         ( ($SiteIP == xxx.xxx.8.0) && ($ThisIP  !xxx.xxx.8./[1-50]) ) ||  
         ( ($SiteIP == xxx.xxx.12.0) && ($ThisIP  !xxx.xxx.12./[1-50]) ) ||  
         ( ($SiteIP == xxx.xxx.16.0) && ($ThisIP  !xxx.xxx.16./[1-50]) ) ||  
         ( ($SiteIP == xxx.xxx.20.0) && ($ThisIP  !xxx.xxx.20./[1-50]) ) ||  
         ( ($SiteIP == yyy.yyy.21.0) && ($ThisIP  !yyy.yyy.21./[1-50]) )  
       )  
      
    
    

    xxx.xxx bedeutet immer dasselbe bei der letzten bedingung ist der erste Teil anders.

    Problem ist halt, dass das Script von mehreren Seiten aus aufgerufen wird, da wird immer ne SiteIP übergeben und nach der richten sich die zu überprüfenden IP-Address. Deswegen muss das alles in die eine Bedingung rein. Wie kann man das eleganter Lösen? Ist es so wie es jetzt ist überhaupt richtig/ funktionstüchtig? Ist immer nen gewisser Aufwand das zu testen da es auf den Server muss. Lokal kann ich das Script leider nicht testen.

    Danke im voraus.

    1. Hi!

      if (
           ( ($SiteIP == xxx.xxx.24.0) && ($ThisIP  !xxx.xxx.24./[1-50]) ) ||
           ( ($SiteIP == xxx.xxx.4.0) && ($ThisIP  !xxx.xxx.4./[1-50]) ) ||
           ( ($SiteIP == xxx.xxx.8.0) && ($ThisIP  !xxx.xxx.8./[1-50]) ) ||
           ( ($SiteIP == xxx.xxx.12.0) && ($ThisIP  !xxx.xxx.12./[1-50]) ) ||
           ( ($SiteIP == xxx.xxx.16.0) && ($ThisIP  !xxx.xxx.16./[1-50]) ) ||
           ( ($SiteIP == xxx.xxx.20.0) && ($ThisIP  !xxx.xxx.20./[1-50]) ) ||
           ( ($SiteIP == yyy.yyy.21.0) && ($ThisIP  !yyy.yyy.21./[1-50]) )
         )

        
      Nein, dieser Code hat noch mehrere Fehler, aber das ist kein Problem. Du hast immerhin schon einmal die IP gefiltert, das ist gut. Jetzt fehlt noch eine Funktion isInRange(ip, from, to), die für die Filterung verantwortlich ist.  
        
      IsInRange muss die entsprechende IP in ihre 4 Stellen demontieren (splitte am Punkt) und die einzelnen Nummern vergleichen.  
        
      Gruß, LX
      
      -- 
      Reguläre Ausdrücke versagen bei irregulären Problemen
      
      1. OK, also quasi den zweiten Teil jeder teilbedingung wo ich $ThisIP !.... habe durch isInRange ersetzen oder wie?

  2. Hallo!

    Ja, man kann das auch mit regulären Ausdrücken machen. Dein Problem ist jedoch irregulär, so dass Du mehr Zeit mit der Suche nach einem regulären Ausdruck aufbringen wirst als damit, eine Regexp zu schreiben, die Dir die IPs heraussucht und mit dem Adressraum vergleicht, den Du filtern willst.

    Gruß, LX

    --
    RFC 1925, Satz 8: Es ist komplizierter als man denkt.
  3. ich habe nen problem: Ich habe ein Script in Perl, das erstellt mir eine Tabelle mit vielen IPs, Mac-Addressen usw. Nun möchte ich dass bestimmte IPs gefiltert und nicht angezeigt werden.

    "Try this" http://forum.de.selfhtml.org/archiv/2009/6/t188199/#m1252329

    Du kannst nach der Umwandlung dann ganz normal vergleichen if($x > $range_1 && $x < $range_2)

    Struppi.

  4. foreach $ThisIP (@ALIVEIPS)
            {

    if (=!!= Hier soll die Bedingung rein =!!=)
            {
            print "<tr><td><a href="http://$ThisIP">$ThisIP</a></td>";
    [/code]

    Die IP wird dann immer wie gewohnt im Format xxx.xxx.xxx.xxx ausgegeben. Ziel ist es alle IPs die alle die ersten 3 Blöcke gleich haben und sich nur im letzten Block unterscheiden. also als Beispiel: 192.168.123.1 bis 192.168.123.50 sollen nicht mehr angezeigt werden. Alle anderen schon.

    Keine Regex
    Lösche den letzten Teil der IP.
    Speichere den resultierenden IP/24-String als Hashkey.
    Gib eine Liste der Hashkeys aus.

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische