while-Schleifen

Dieses Thema: "while-Schleifen" im Forum "Ruby, php, Perl, Python ..." wurde erstellt von iceman99, 01.06.2006.

  1. #1 iceman99, 01.06.2006
    iceman99

    iceman99 Jungspund

    Dabei seit:
    23.05.2006
    Beiträge:
    19
    Zustimmungen:
    0
    Hallo,
    ich versuche mich gerade in einer verschachtelten while-Schleife.

    Warum wird die erste Schleife nur einmal durchlaufen? Was kann ich ändern?

    #!/usr/bin/perl -w

    use strict;

    @PORTS=(21,22,25,53,66,80,81,110,118,119,150,156);
    $ZAEHLER=0;
    open(FILE,"hosts.list") || die "Fehler beim Öffnen der Datei: $!\n";
    while(defined(my $i = <FILE>)) {
    while ($ZAEHLER <= 11) {
    print "$i $PORTS[$ZAEHLER]";
    $ZAEHLER++;
    }
    }

    Bis dann
     
  2. Anzeige

    Schau dir mal diesen Ratgeber an. Viele Antworten inkl. passender Shell-Befehle!
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 supersucker, 01.06.2006
    Zuletzt bearbeitet: 01.06.2006
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    Code:
    open(FILE,"hosts.list") || die "Fehler beim Öffnen der Datei: $!\n";
    while(defined(my $i = <FILE>)) {
    Natürlich wird sie nur einmal durchlaufen.

    Du öffnest schließlich ja auch nur ein file.

    Noch ein paar Anmerkungen zu deinem Code:

    1. Code tags benutzen
    2. Es ist immer eine schlechte Idee Variablen deutsch zu benennen.
    3.
    Code:
    while ($ZAEHLER <= 11) 
    Und wenn du einen Port hinzufügst im Array willst du ja wohl nicht in jeder Schleife die 11 auf 12 inkrementiern, oder?
    Code:
    while ($count < $ports) // $ports ist die länge des arrays 
    4. nur Konstanten sollte man groß schreiben.
     
  4. #3 iceman99, 01.06.2006
    iceman99

    iceman99 Jungspund

    Dabei seit:
    23.05.2006
    Beiträge:
    19
    Zustimmungen:
    0
    Klar, aber in dem File sind eine Menge Einträge. Die Schleifen funktionieren ohne die Verschachtelung ja auch.

    Wie kann ich das Problem lösen?
     
  5. #4 supersucker, 01.06.2006
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    Zeig mal einen Auszug aus der Datei und beschreib was du machen willst.

    Ohne das zu wissen ist es schwer zu helfen.
     
  6. #5 iceman99, 01.06.2006
    iceman99

    iceman99 Jungspund

    Dabei seit:
    23.05.2006
    Beiträge:
    19
    Zustimmungen:
    0
    Hi,
    hier ist ein Auszug aus der Dateiliste:

    checkit1.gambit.net
    cnt1-wsb.gambit.net
    cnt2-wsb.gambit.net
    contentdb.xon.gambit.net
    contentdb1-wsb.xon.gambit.net
    contentdb2-wsb.xon.gambit.net

    Diese möchte ich der Reihe nach mit den Ports aus @PORTS per telnet abfragen und die Antwort dann zur Auswertung in eine Datei schreiben.

    D.h.
    telnet checkit1.gambit.net 21
    telnet checkit1.gambit.net 22
    telnet checkit1.gambit.net 25
    ....
    telnet cnt1-wsb.gambit.net 21
    telnet cnt1-wsb.gambit.net 22
    telnet cnt1-wsb.gambit.net 25
    .....
    usw.

    Das soll dabei rauskommen.
     
  7. #6 supersucker, 01.06.2006
    Zuletzt bearbeitet: 01.06.2006
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    ungetester Schnellschuß:

    Code:
    #!/usr/bin/perl
    
    use strict;
    use warning;
    
    my @ports=(21,22,25,53,66,80,81,110,118,119,150,156);
    my $host;
    my $line;
    my $scanStatus;
    my $telnetCommand;
    
    open(INFILE,"<hosts.list") || die "Could not open file: $!\n";
    open(OUTFILE, ">>scanresults") || die "Could not open file: $!\n";
    
    while($line = <INFILE>) {
       if($line=~ m/(^[a-z.-]+)(\s+$)/){
          $host = $1;
          foreach my $singlePort(@ports){
              $telnetCommand = "telnet " . $host . " " . $singlePort;
              $scanStatus = qx($telnetCommand);
              print OUTFILE $host . " " . $singlePort . "  scanresult: " . $scanStatus; 
          }
       }
    }
    close(INFILE)|| die "Could not close file: $!\n";
    close(OUTFILE)|| die "Could not close file: $!\n";
    
    
    
    EDIT:

    1. sollte klar sein das so eine telnet - Abfrage ewig dauern kann.
    2. kann man das script natürlich noch effizienter machen und sich einige Variablen sparen die ich dringelassen habe, damit du besser verstehst was da passiert.
     
Thema:

while-Schleifen