WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Linux, UNIX, Open Source (http://www.wcm.at/forum/forumdisplay.php?f=13)
-   -   perl Problem (http://www.wcm.at/forum/showthread.php?t=102693)

K@sperl 15.07.2003 17:11

perl Problem
 
Ich hab auf meiner Linux Box Zaval FileSearch installiert, mit diesem Programm kann ich im Netzwerk diverse FTP Server scannen und dann via Web-Interface nach Dateien suchen
http://www.zaval.org/products/file-search/

Nun hab ich dem Entwickler geschrieben, ob es nicht möglich sei, für jeden FTP Server User, Passwort und Port anzugeben, also in der Form ftp://user:pass@host:port

Er hat mir auch zurückgeschrieben welche Änderungen ich in der Datei, die den Hostscan macht, vornehmen soll, leider jedoch ist der Code nicht korrekt und von perl hab ich überhaupt keine Ahnung ...

Hier mal ein Ausschnitt des Quellcodes welchen mir der Entwickler geschickt hat
Code:

        my $port = '21', $login, $pwd;
        if( $host =~ /\@/ ){
            $login = $host;
            if( $host =~ /\@(.)+\:/ ){
                ($host, $port) = split(':', $host);
            }
            $login =~ s/\@(.)+$//;
            ($login,$pwd) = split(':', $login);
            $ftp = Net::FTP->new($host, Port=>$port);
            $ftp->login($login, $pwd) if (defined $ftp);
        }
        else{
            $ftp = Net::FTP->new($host);
            $ftp->login($ENV{"FTP_USER"},$ENV{"FTP_PASSWORD"}) if (defined $ftp);
        }

Es geht hier nun darum, auf den FTP zuzugreifen (mit User und Pass). Eingetragen werden die zu scannenden FTPs in eine Datei. Ich hab nun mal probiert, eine FTP einzutragen (in die Datei), in der Form ftp://IP, also müßte das Programm in den else Zweig springen, das macht es aber anscheinend nicht, da nichts ausgegeben wird (im Normalfall werden alle Dateien und Verzeichnis in ein File geschrieben, welches dann durchsucht werden kann).


Hier der Link zum gesamten File
http://www.geraldholl.cc/scan-host.pl.txt

FIREwaLKER 15.07.2003 17:57

Welche Meldung gibt der Interpreter aus wenn du das Programm startest?

K@sperl 15.07.2003 18:00

Keine, sprich kein Syntax Fehler ...

_m3 15.07.2003 18:01

Hat mich wer gerufen? ;)

Du musst den Code schon in das Script einbauen, sonst klappt es nicht! ;)

Ab Zeile 207 in deinem Code:
Code:

        # The result file has the following structure:
        # {File=>F, Dir=>D}:{date:optional}:size:full path

        $ftp = Net::FTP->new($host);
        if (defined $ftp) {
            $ftp->login($ENV{"FTP_USER"},$ENV{"FTP_PASSWORD"});

ersetzen durch
Code:

        # The result file has the following structure:
        # {File=>F, Dir=>D}:{date:optional}:size:full path

        my $port = '21', $login, $pwd;
        if( $host =~ /\@/ ){
            $login = $host;
            if( $host =~ /\@(.)+\:/ ){
                ($host, $port) = split(':', $host);
            }
            $login =~ s/\@(.)+$//;
            ($login,$pwd) = split(':', $login);
            $ftp = Net::FTP->new($host, Port=>$port);
            $ftp->login($login, $pwd) if (defined $ftp);
        }
        else{
            $ftp = Net::FTP->new($host);
            $ftp->login($ENV{"FTP_USER"},$ENV{"FTP_PASSWORD"}) if (defined $ftp);
        }

Die Umgebungsvariablen FTP_USER und FTP_PASSWORD sind gesetzt?

_m3 15.07.2003 18:10

Ich werde nie wieder gleichzeitig Perl-coden und telefonieren.
Ich werde nie wieder gleichzeitig Perl-coden und telefonieren.
Ich werde nie wieder gleichzeitig Perl-coden und telefonieren.
Ich werde nie wieder gleichzeitig Perl-coden und telefonieren.

Der richtige neue Code lautet:
Code:

        # ORI.m3: $ftp = Net::FTP->new($host);
        # ORI-m3: if (defined $ftp) {
        # ORI.m3:    $ftp->login($ENV{"FTP_USER"},$ENV{"FTP_PASSWORD"});

        my $port = '21', $login, $pwd;
        if( $host =~ /\@/ ){
            $login = $host;
            if( $host =~ /\@(.)+\:/ ){
                ($host, $port) = split(':', $host);
            }
            $login =~ s/\@(.)+$//;
            ($login,$pwd) = split(':', $login);
            $ftp = Net::FTP->new($host, Port=>$port);
            $ftp->login($login, $pwd) if (defined $ftp);
        }
        else{
            $ftp = Net::FTP->new($host);
            $ftp->login($ENV{"FTP_USER"},$ENV{"FTP_PASSWORD"}) if (defined $ftp);
        }
       
        if (defined $ftp) {
            @list=$ftp->ls("-lR");


K@sperl 15.07.2003 18:19

@m3
geht leider auch noch nicht ...

Wenn ich in der Datei keinen User und pass angebe, dann verbindet er sich zum FTP, gebe ich jedoch User und pass an, dann verbindet er sich überhaupt nicht zum Server ...

_m3 15.07.2003 18:38

Wie gibst du es denn an?

K@sperl 15.07.2003 18:40

ftp://user:pass@IP

K@sperl 15.07.2003 18:50

Ich hab jetzt mal mittels einer print Anweisung $login und $pwd ausgegeben, die sind korrekt, jedoch der Port wird noch falsch erkannt ... Aber warum erfolgt kein Login trotz korrekten Users und Passwortes?

edit: ich hab den Fehler, bei $port steht immer passwort@IP drinnen ... nur was is da falsch?

edit2: Auch die IP passt nicht, in der Var. $host steht immer der username drin

K@sperl 15.07.2003 19:22

Soda, jetzt hab ich's gelöst:

Code:

        my $port = '21', $login, $pwd;
        if( $host =~ /\@/ ){
            $login = $host;
            if( $host =~ /\@(.)+\:/ ){
                ($test, $host) = split('@', $host);
                ($host, $port) = split(':', $host);
            }
            else {
            ($test, $host) = split('@', $host); 
            }
            $login =~ s/\@(.)+$//;
            ($login,$pwd) = split(':', $login);
            $ftp = Net::FTP->new($host, Port=>$port);
            $ftp->login($login, $pwd) if (defined $ftp);
        }
        else{
            $ftp = Net::FTP->new($host);
            $ftp->login($ENV{"FTP_USER"},$ENV{"FTP_PASSWORD"}) if (defined $ftp);
        }


_m3 15.07.2003 19:39

:)

K@sperl 16.07.2003 13:42

Ich bräuchte da noch eine kleine Hilfestellung:

Ich möchte testen, ob ein gewisses Zeichen in einer Variable enthalten ist, wie geht das?

Also in der Art
if $name contains '@' { ... }

käptn 16.07.2003 14:08

Zitat:

Original geschrieben von Flanders
Code:

        if( $host =~ /\@/ ){

HTH

~

K@sperl 20.07.2003 13:52

Jetzt bräuchte ich noch mal was ...

In Pascal gibt es die Möglichkeit abzufragen, ob ein bestimmtes Zeichen an einer bestimmten Stelle eines Strings steht, und zwar
if str[1] <> 'a' then ...

Ist sowas auch in perl möglich?
Ich möchte prüfen, ob an der ersten Stelle einer Variable ein '/' steht, falls nicht, soll dieser am Anfang eingefügt werden.

käptn 20.07.2003 20:20

Ohne Gewähr:

Code:

if (! ($str =~ /^\//) )
Code:

if (substr($str, 0,1) neq '/')
HTH

~

K@sperl 20.07.2003 20:24

Zitat:

Original geschrieben von käptn
Code:

if (! ($str =~ /^\//) )

Ok, danke, und wie füge ich nun einen '/' ganz am Anfang von $str ein?

käptn 20.07.2003 20:35

Hab leider k.A. wie der CONCAT-Operator in Perl ausschaut...

Code:

$str = '/' . $str;
oder
Code:

$str = '/' + $str;
~

K@sperl 20.07.2003 20:39

Zitat:

Original geschrieben von käptn
Code:

$str = '/' . $str;

Das war's, danke.

K@sperl 20.07.2003 20:48

Die if Abfrage passt leider noch nicht,
if (! ($str =~ /^\//) )

prüft anscheinend den ganzen String und nicht nur die erste Stelle

und

if (substr($str, 0,1) neq '/')

gibt einige Syntaxfehler aus


edit:
if (substr($str, 0,1) ne '/') ist korrekt, prüft aber auch nur den gesamten String und nicht genau die erste Stelle.


edit2:
Jetzt geht's, hab bei substr den "1" vergessen :D


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag