Patrick Andrieu: Fehler beim Einsatz von Net::Ftp::File - Perl Package Manager

Hallo alle!

Zwei Fragen, ein Thread!

1. Net::Ftp::File

Ziel ist, eine Datei auf dem Webserver hochzuladen und anschließend
   deren Rechte zu ändern. Datei bekommt nach dem Hochladen ja automatisch
   644, ich möchte aber beispielsweise 600 haben, halte mich an die Modul-Beschreibung (#$ftp->chmod):

  
   C:\>perl -w  
   use strict;  
   use Net::FTP::File;  
  
   my $ftp = Net::FTP->new("ftp.atomic-eggs.com", Debug => 0)  
     or die "Cannot connect to some.host.name: $@";  
  
   $ftp->login("myusername",'myPaSSwoRd')  
     or die "Cannot login ", $ftp->message;  
   $ftp->cwd("justanotherdir") or die "Cannot change working directory ", $ftp->message;  
   $ftp->put("localfile.txt", "TESTNETFTP.txt") or die $!;        # Datei bekommt automatisch 644  
   $ftp->chmod(600,"TESTNETFTP.txt") or die $ftp->message;

Ich erhalte die Meldung:

Unknown command 'SITE SITE CHMOD'

Kann das jemand bestätigen? Ist es ein Fehler in meiner Handhabung des Moduls oder im Modul selbst?

Gelöst habe ich es wie weiter unten, nachdem ich mir die entsprechenden Funktionen
   in Net::Ftp::File _und_ im »Muttermodul« Net::FTP angeschaut habe. In Net::FTP::File
   steht:

  
   sub Net::FTP::chmod {  
      my $ftp = shift;  
      if($ftp->supported('SITE CHMOD')) {  
         my $chmod = $ftp->site('CHMOD',@_);  
         return 1 if $chmod == 2;  
         return 0 if $chmod == 5;  
         return -1;  
      }  
      return undef;  
   }

Und die sub site in Net::FTP sieht so aus:

  
  sub site {  
     my $ftp = shift;  
  
     $ftp->command("SITE", @_);  
     $ftp->response();  
   }

Irgendwie wundert mich nicht, dass da zweimal SITE kommt, oder? - auch wenn ich nicht
   ganz durchblicke ;).... so habe ich mir aber geholfen:

  
   C:\>perl -w  
   use strict;  
   use Net::FTP;  
  
   my $ftp = Net::FTP->new("ftp.atomic-eggs.com", Debug => 0)  
      or die "Cannot connect to some.host.name: $@";  
  
   $ftp->login("myusername",'myPaSSwoRd')  
     or die "Cannot login ", $ftp->message;  
   $ftp->cwd("justanotherdir") or die "Cannot change working directory ", $ftp->message;  
   $ftp->put("localfile.txt", "TESTNETFTP.txt") or die $!;        # Datei bekommt automatisch 644  
   my $dateiname = "TESTNETFTP.txt";  
   $ftp->command("SITE CHMOD", 600,$dateiname) or die $ftp->message;

Übrigens gibt es sowohl in /perl/lib ($VERSION = "2.75";) als auch in /perl/site/lib
   ($VERSION = '2.77';) ein Modul FTP.pm. Bei use Net::FTP; wird 2.75 geladen (geprüft mit
   der Ausgabe von print $Net::FTP::VERSION;). Warum gibt es die Module oft zwei Mal, und
   warum wird nicht immer die neueste Version geladen?

2. PPM

Wurde der Perl Package Manager erneuert? Ich bat gerade jemand, Image::Size zu installieren,
   sagte, er soll in der Konsole »ppm« eintippen und dann, wenn der ppm-Prompt kommt »install
   Image-Size«, doch poppt bei dem gleich nach der ppm-Eingabe ein Windows-Fenster auf? Was hat
   es in sich?

Viele Grüße aus Frankfurt/Main,
Patrick

--

_ - jenseits vom delirium - _
[link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
Nichts ist unmöglich? Doch!
Heute schon gegökt?
  1. 你好 Patrick,

    Unknown command 'SITE SITE CHMOD'
    [...]
          if($ftp->supported('SITE CHMOD')) {

    Sieht so aus, als sei hier der Hase im Pfeffer begraben. Ich vermute mal, da muss das SITE wech.

    sub site {
         my $ftp = shift;

    $ftp->command("SITE", @_);
         $ftp->response();
       }

    
    >   
    >    Irgendwie wundert mich nicht, dass da zweimal SITE kommt, oder?  
      
    Ne, das ist so ja korrekt, einmal wird das Kommando übergeben (CHMOD) und dann wird per ->command noch ein SITE davorgehangen. Dass ->command kein weiteres SITE davorhängt, siehst du ja daran, dass bei deinem Würgaround kein weiteres SITE davorgehängt wird.  
      
    再见,  
     克里斯蒂安  
    
    -- 
    [Bauer sucht Frau!](http://ck.kennt-wayne.de/bauer-sucht-frau) | [Ich bin ja eigentlich kein Serien-Junkie…](http://ck.kennt-wayne.de/ich-bin-ja-eigentlich-kein-serien-junkie)  
    Das Leben ist wie ein Kartenspiel: was dir gegeben wurde, ist vorbestimmt. Doch wie du damit spielst, ist deine Entscheidung.  
      
    <http://wwwtech.de/>  
    
    
    1. Hallo Christian und schön, dass man Dich hier wieder sieht!

      Sieht so aus, als sei hier der Hase im Pfeffer begraben. Ich vermute mal, da muss das SITE wech.

      Ja, wahrscheinlich. Jedenfalls ist es doch ein Fehler im Modul, oder?

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --

      _ - jenseits vom delirium - _
      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
      Nichts ist unmöglich? Doch!
      Heute schon gegökt?
      1. 你好 Patrick,

        Hallo Christian und schön, dass man Dich hier wieder sieht!

        Hihi, danke.

        Sieht so aus, als sei hier der Hase im Pfeffer begraben. Ich vermute mal, da muss das SITE wech.

        Ja, wahrscheinlich. Jedenfalls ist es doch ein Fehler im Modul, oder?

        Schaut ganz danach aus.

        再见,
         克里斯蒂安

        --
        Bauer sucht Frau! | Ich bin ja eigentlich kein Serien-Junkie…
        Es ist uns nicht möglich, in einem Bereich unseres Lebens richtig zu verhalten, wenn wir in allen anderen falsch handeln. Das Leben ist ein unteilbares Ganzes.
        http://wwwtech.de/
        1. Hallo Christian!

          Ja, wahrscheinlich. Jedenfalls ist es doch ein Fehler im Modul, oder?
          Schaut ganz danach aus.

          Muss man sowas melden, wenn ja wem (Autor oder CPAN)?

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --

          _ - jenseits vom delirium - _
          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
          Nichts ist unmöglich? Doch!
          Heute schon gegökt?
          1. 你好 Patrick,

            Ja, wahrscheinlich. Jedenfalls ist es doch ein Fehler im Modul, oder?
            Schaut ganz danach aus.

            Muss man sowas melden, wenn ja wem (Autor oder CPAN)?

            Müssen muss man nur sterben, aber es ist immer nett, Fehler zu melden. Und zwar dem Autor ;)

            再见,
             克里斯蒂安

            --
            Bauer sucht Frau! | Ich bin ja eigentlich kein Serien-Junkie…
            Sein oder nicht sein, das ist hier die Frage!
            http://wwwtech.de/
            1. Hallo Christian!

              Müssen muss man nur sterben, aber es ist immer nett, Fehler zu melden. Und zwar dem Autor ;)

              [x] Done!

              Danke!

              Viele Grüße aus Frankfurt/Main,
              Patrick

              --

              _ - jenseits vom delirium - _
              [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
              Nichts ist unmöglich? Doch!
              Heute schon gegökt?
            2. Hallo Christian!

              Dieser Beitrag nur noch zur Info. Vielleicht interessiert er auch Alexander (HH), da wir uns schon mal über 1&1-Konfigurationen gewundert haben ;)

              Und zwar dem Autor ;)

              Wie Mittwoch erwähnt, habe ich es gemacht, Dan Muey gab mir einige Tests zu machen.

              Erster:

              print "DEBUG\n".$ftp->site('CHMOD',600,'TESTNETFTP.txt')."\n";
                print "DEBUG\n".$ftp->message()."\n";

              Ausgabe:

              DEBUG
                2
                DEBUG
                SITE CHMOD command successful

              Im zweiten Test ging es darum, die if-Abfrage der Sub »Net::FTP::chmod» wie folgt zu ergänzen:

              if ($ftp->supported('CHMOD') || $ftp->supported('SITE CHMOD')) {

              Ich erhielt aber immer noch die Response (beim selben Aufruf wie im Ausgangsposting):

              Unknown command SITE SITE CHMOD

              Dann folgten zwei Tests direkt auf der Kommandozeile:

              Tests you asked me to do (with results):
                  Notice: I had to invert ' to " and " to ' because the call does'nt work on
                  WinXP's cmd.exe if first args are not included inbetween ""...

              first:

              C:>perl -MData::Dumper -Mstrict -MNe
                  t::FTP -le "my $ftp=Net::FTP->new(shift @ARGV);$ftp->login(@ARGV) or die $ftp->m
                  essage;print Dumper [$ftp->supported('CHMOD')];print Dumper [$ftp->message];" HOST USER PASSW
                  $VAR1 = [
                            0
                          ];

              $VAR1 = [
                            'Unknown command 'CHMOD'
                  '
                          ];

              second:

              C:>perl -MData::Dumper -Mstrict -MNe
                  t::FTP -le "my $ftp=Net::FTP->new(shift @ARGV);$ftp->login(@ARGV) or die $ftp->m
                  essage;print Dumper [$ftp->supported('SITE CHMOD')];print Dumper [$ftp->message];" HOST USER PASSW
                  $VAR1 = [
                            0
                          ];

              $VAR1 = [
                            'Unknown command 'SITE SITE CHMOD'
                  '
                          ];

              Bei Dan:

              $ perl -MData::Dumper -Mstrict -MNet::FTP -le 'my $ftp=Net::FTP->new(shift @ARGV);$ftp->login(@ARGV) or die $ftp->message;print Dumper [$ftp->supported("CHMOD")];my @x = $ftp->message;chomp @x;print Dumper @x;' HOST USER PASS
              $VAR1 = [
                        1
                      ];

              $VAR1 = [
                        'The following SITE commands are recognized',
                        ' ALIAS',
                        ' CHMOD',
                        ' IDLE',
                        ' UTIME',
                        'Pure-FTPd - http://pureftpd.org/'
                      ];

              $ perl -MData::Dumper -Mstrict -MNet::FTP -le 'my $ftp=Net::FTP->new(shift @ARGV);$ftp->login(@ARGV) or die $ftp->message;print Dumper [$ftp->supported("SITE CHMOD")];my @x = $ftp->message;chomp @x;print Dumper @x;' HOST USER PASS
              $VAR1 = [
                        1
                      ];

              $VAR1 = [
                        'The following SITE commands are recognized',
                        ' ALIAS',
                        ' CHMOD',
                        ' IDLE',
                        ' UTIME',
                        'Pure-FTPd - http://pureftpd.org/'
                      ];

              Hier die restliche Antwort von Dan:

              <cite>
              What FTP daemon is running on it?

              I ask because its telling you it can't do it but it can apparently and its looking for it backwards
              That FTP daemon appears to be misconfigured.

              I can't change chmod() to blindly issue a SITE CHMOD (IE remove that if statement)  since some don't support it (think window's based FTP servers) and issueing invalid commands can cause issues.

              Plus, if you look at the tests I sent for you to run:

              a) it's not using Net::FTP::File (IE problem is not in chmod()'s logic)
               b) The server says it doesn't support it (but then apparently it does):
                  - Unknown command 'CHMOD'
                  - Unknown command 'SITE SITE CHMOD'
              c) the server does not add a SITE on the first one and appends it *again* if it has one already.
              </cite>

              Die Statuscodes in der FTP.log sind immer 502 (Command not implemented). Im Erfolgsfall (bei meinem Würgaround, bei einem zweiten kommentiere ich direkt in einer Modulkopie File2.pm die if-$ftp->supported-Abfrage) ist es ja 200.

              Viele Grüße aus Frankfurt/Main,
              Patrick

              --

              _ - jenseits vom delirium - _
              [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
              Nichts ist unmöglich? Doch!
              Heute schon gegökt?
    1. PPM

    Wurde der Perl Package Manager erneuert?

    Ja. PPM 4 gibt es jetzt mit einer grafischen Oberfläche.

    Struppi.

    1. Hallo Struppi!

      Ja. PPM 4 gibt es jetzt mit einer grafischen Oberfläche.

      Ah ok, danke. Mittlerweile ist Engin mit dieser auch klargekommen, also ist sie DAU-Sicher (DECKUNG)!

      BTW und OT und MENSCHELEI:

      JavaScript ist gar nicht toll, Struppi ;)

      Ich hatte ewig nichts mehr mit gemacht, wollte meine Roadster-Galerien [1] erneuern, und Perl erkennt ja sofort ob es mit einem String oder einer Zahl zu tun hat - mit JS hatte ich eben meine liebe Not. Außerdem: Wer war so hirnrissig, sich einen einzigen Operator auszudenken, der sowohl für die String-Verknüpfung als auch für die Addition zuständig ist, nämlich »+«!!!1elf

      isNaN(blubb) und isNaN(blabb) lieferten beide false (also hatte ich doch mit Zahlen zu tun) - dachte ich...:
      blubb + blabb liefert dennoch nicht die Addition beider Zahlen, sondern eine Verknüpfung aus den Zahlenstrings: bei 999 für blubb und 1 für blabb erhielt ich 9991 statt 1000...
      Erst parseInt(blubb) + parseInt(blabb) ergibt 1000.
      Oder habe ich irgendeine geniale Möglichkeit übersehen (oder mit der Zeit vielleicht vergessen), Zahlen aus Variablen zu addieren? :)

      http://www.atomic-eggs.com/roadster/20040228/index2.shtml -> mein erstes Skript mit Object Literals ;)
      In diesem Verzeichnis gibt es auch eine index.shtml (und in allen andern Galerien) mit dem alten JS-Skript. Dort füllt allerdings ein Perl-Skript das Thumnail-DIV, berechnet auch dessen Breite, schreibt drei Variablen im JS-Bereich (erste Bild-Nr., letzte Bild-Nr., Differenz).

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --

      _ - jenseits vom delirium - _
      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
      Nichts ist unmöglich? Doch!
      Heute schon gegökt?
      1. BTW und OT und MENSCHELEI:

        JavaScript ist gar nicht toll, Struppi ;)

        Doch! ;)

        isNaN(blubb) und isNaN(blabb) lieferten beide false (also hatte ich doch mit Zahlen zu tun) - dachte ich...:

        Nein auch isNaN wandelt im zweifelsfall intern die Parameter in Zahlen um.

        Erst parseInt(blubb) + parseInt(blabb) ergibt 1000.

        genau du musst den String explizit umwandeln, wobei es so gefährlich ist.
        javascript:alert(parseInt('010') * 1);

        Oder habe ich irgendeine geniale Möglichkeit übersehen (oder mit der Zeit vielleicht vergessen), Zahlen aus Variablen zu addieren? :)

        Es gab hier schon viele Diskussionen um das Problem, ich weiß gar nicht mehr was sich als am "besten" herauskristallisiert hatte.

        Es gibt mehrere Möglichkeiten:
        parseInt(string, radix) oder Number(String) oder String * 1

        Struppi.

        1. Hallo Struppi!

          JavaScript ist gar nicht toll, Struppi ;)
          Doch! ;)

          Naja, wenn man sich vorher viel mit Perl beschäftigt hat, und lange nicht mehr JS angerührt hat, ist es jedes Mal eine Umstellung, die umgekehrt so schlimm nicht ist.

          Nein auch isNaN wandelt im zweifelsfall intern die Parameter in Zahlen um.
          genau du musst den String explizit umwandeln, wobei es so gefährlich ist.
          javascript:alert(parseInt('010') * 1);

          Aha, wie kommt hier die 8 zustande?

          Es gibt mehrere Möglichkeiten:
          parseInt(string, radix) oder Number(String) oder String * 1

          Number() tut's, danke!

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --

          _ - jenseits vom delirium - _
          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
          Nichts ist unmöglich? Doch!
          Heute schon gegökt?
          1. Moin!

            javascript:alert(parseInt('010') * 1);

            Aha, wie kommt hier die 8 zustande?

            Zahlen mit führender Null werden von Javascript als Oktalzahl interpretiert, nicht als Dezimalzahl.

            Wenn du sichergehen willst, dass der String zu einer Dezimalinterpretation führt, mußt du parseInt mit dem zweiten Parameter benutzen und dort 10 angeben.

            parseInt('010',10) ergibt immer 10.

            Das ist ungefähr so wichtig, wie das Escaping von Benutzereingaben! Vorausgesetzt, man will sich merkwürdige Fehlinterpretationen sparen. Die Konsequenzen sind aber zum Glück nicht ganz so katastrophal, wie bei fehlendem Escaping.

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
            1. Hallo Sven!

              Aha, wie kommt hier die 8 zustande?
              Zahlen mit führender Null werden von Javascript als Oktalzahl interpretiert, nicht als Dezimalzahl.

              Hm, ja ich hatte in Perl sowas auch gelesen.

              Wenn du sichergehen willst, dass der String zu einer Dezimalinterpretation führt, mußt du parseInt mit dem zweiten Parameter benutzen und dort 10 angeben.
              parseInt('010',10) ergibt immer 10.

              Ah, ok. So einen »zweiten« Parameter gibt es bei Perls »int()« wohl nicht.

              Danke, mit Struppis Tipps und Deins etwas schlauer geworden!

              Viele Grüße aus Frankfurt/Main,
              Patrick

              --

              _ - jenseits vom delirium - _
              [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
              Nichts ist unmöglich? Doch!
              Heute schon gegökt?