PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : while-Schleifen



iceman99
01.06.2006, 12:50
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

supersucker
01.06.2006, 13:31
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.

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?

while ($count < $ports) // $ports ist die länge des arrays

4. nur Konstanten sollte man groß schreiben.

iceman99
01.06.2006, 13:34
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?

supersucker
01.06.2006, 13:38
Zeig mal einen Auszug aus der Datei und beschreib was du machen willst.

Ohne das zu wissen ist es schwer zu helfen.

iceman99
01.06.2006, 14:19
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.

supersucker
01.06.2006, 14:39
ungetester Schnellschuß:


#!/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.