Fehler beim Einsatz von Net::Ftp::File - Perl Package Manager
![](/uploads/default_avatar/thumb/missing.png)
- perl
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
你好 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/>
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
你好 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.
再见,
克里斯蒂安
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
你好 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 ;)
再见,
克里斯蒂安
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
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
- PPM
Wurde der Perl Package Manager erneuert?
Ja. PPM 4 gibt es jetzt mit einer grafischen Oberfläche.
Struppi.
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
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.
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
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
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