Perl und FTP Problem
gt
- perl
Hi,
kleines Problem hier mit einem Perl FTP Client. Also, ich versuche mich mit einem Perlscript an einem FTP-Server anzumelden, was aber daran scheitert das verschiedene FTP-Server unterschiedlich viele 220 Informationen liefern. Bei Server a klappt es z.B. wenn ich 3 220 Infos abwarte und dann den Usernamen sende, aber wenn ich das bei einem FTP-Server versuche der nur ein mal 220 sendet bleibt das Script dabei hängen :(
Gibt es eine Möglichkeit abzufragen wie oft der Server 220 sendet und wann er dann bereit ist den Usernamen zu empfangen?
Danke.
Ich habe es so versucht (klappt wie gesagt nur wenn genau so viele $antwort abgefragt werden wie 220‚er kommen...):
$ftpsocket = IO::Socket::INET->new
(
PeerAddr => $Host,
PeerPort => 21,
Proto => "tcp",
Type => SOCK_STREAM
)
die "Socketverbindung fehlgeschlagen $remote_host:$remote_port $!\n";
$antwort = <$ftpsocket>;
print "Version = $antwort";
print LOG "Version = $antwort";
$antwort = <$ftpsocket>;
if ($antwort=~ /220/)
{
print "Version = $antwort";
print LOG "Version = $antwort";
}
$antwort = <$ftpsocket>;
if ($antwort=~ /220/)
{
print "Version = $antwort";
print LOG "Version = $antwort";
}
print "Trying anonymous connection...\n";
print LOG "Trying anonymous connection...\n";
print $ftpsocket "user anonymous\015\012";
$antwort = <$ftpsocket>;
print "$antwort\n";
print LOG "$antwort\n";
if ($antwort=~ /530/)
{
print "Anonymous access ist restricted on this host\n";
print LOG "Anonymous access ist restricted on this host\n";
}
elsif ($antwort=~ /331/)
{
print "Sending email as password...\n";
print LOG "Sending email as password...\n";
print $ftpsocket "pass guest@unknown\015\012";
$antwort = <$ftpsocket>;
print $antwort;
print LOG $antwort;
print $ftpsocket "close\015\012";
print $ftpsocket "quit\015\012";
}
close($ftpsocket);
}
hallo,
Gegenfrage: Warum nimmst Du nicht gleich das LWP- oder Net::FTP-Modul?
mit 'Net::FTP' konnte es so aussehen:
use Net::FTP;
$ftp = Net::FTP->new($Host);
$ftp->login("anonymous","me@here.there");
$ftp->cwd("/pub");
$ftp->get("that.file");
$ftp->quit;
Und zwischen Login und quit, kannst Du dich austoben, wie Du willst.
Und mit LWP ist's auch nicht komplizierter, aber Net::FTP kommt mir flexibler vor.
Ach ja, ältere Versionen von Net::FTP haben etwas schwierigkeiten mit dem FTP-Server vom IIS 3.0. Manchmal wurden Dateien nicht richtig übertragen aber die aktuelle Version funktioniert blendend.
Grüße
Klaus
Hi,
Gegenfrage: Warum nimmst Du nicht gleich das LWP- oder Net::FTP-Modul?
regards
gt
hallo,
Das Net::FTP-Modul ist Teil von 'libnet', das auch Module für POP3, SMTP, NNTP usw. enthält. Normalerweise sollte Dein Provider diese Module auch installiert haben.
Natürlich könntest Du vom FTP-Modul abkupfern, aber das ist m.E. nicht die feine englische Art.
Das Ganze ohne Modul programmieren?
Warum?
Ich hab'noch nie die Lust verspürt, das Rad ein zweites Mal zu erfinden. Oder wie es Larry Wall mal gesagt hat: "Faulheit ist eine der Tugenden eines guten Programmierers".
Und mit dem Net::FTP Modul hast Du doch alles schon fertig. Das ist ja auch der Sinn eines Moduls.
Und es gibt noch einen Grund für die Verwendung des entsprechenden Moduls:
Ich bin der Meinung, daß Du die Sache mit FTP und so sowieso mit Deinem ISP absprechen solltest. Dann kann er, falls es nicht sowieso installiert ist, gleich das Standard-Modul verwenden. Das ist für ihn sicher auch besser, weil er weiß, daß er damit ein großteils ausgetestetes Modul uinstalliert.
Wenn Du das ganze jedoch neu machst, dann mußt Du es erst mal zu solch einer Entwicklungsreife bringen.
Dein ISP läßt sich mit einem selbstgeschnitzten FTP-Script auf mehr Fehlerquellen ein, als bei den 'libnet'-Modulen.
Bitte berücksichtige auch das.
Grüße
Klaus
Hi,
hmmm ja hört sich vernünftig an. Ich werde mal meinen ISP darauf anhauen und (sofern ich darf *g*) aus deinem Posting zitieren.
many thx,
gt