#perl
#perl
Вопрос:
Я написал приведенную ниже программу FTP-клиента на perl. Который нормально выполняется на одном сервере. Если я попытаюсь выполнить то же самое на другом сервере, я получаю ошибку PASV command not implemented. Если я задам Passive=> 0 в конструкторе FTP, я получу команду ALLO, которая не реализована. Не могли бы вы рассказать, почему я получаю эту ошибку и как устранить эту ошибку.
#!/usr/bin/perl -w
use strict; # Don't forget !
use Net::FTP;
my $host = "X.X.X.X";
my $user = "abc";
my $password = "xxx";
my $f = Net::FTP->new($host,Debug=>1) or die "Can't open $host $@n";
$f->login($user, $password) or die "Can't log $user inn", $f->message;
$f->binary();
$f->put("abc.txt"); # or die "unable to send the file",$f->message;
$f->quit or die "unbale to close the conenction";
— Ниже приведен вывод:
Net::FTP>>> Net::FTP(2.79)
Net::FTP>>> Exporter(5.58)
Net::FTP>>> Net::Cmd(2.30)
Net::FTP>>> IO::Socket::INET(1.29)
Net::FTP>>> IO::Socket(1.29)
Net::FTP>>> IO::Handle(1.25)
Net::FTP=GLOB(0x99cabe8)<<< 220 X.X.X.X FTP server ready.
Net::FTP=GLOB(0x99cabe8)>>> USER abc
Net::FTP=GLOB(0x99cabe8)<<< 331 Password required for abc.
Net::FTP=GLOB(0x99cabe8)>>> PASS ....
Net::FTP=GLOB(0x99cabe8)<<< 230 User abc logged in.
Net::FTP=GLOB(0x99cabe8)>>> TYPE I
Net::FTP=GLOB(0x99cabe8)<<< 200 Type set to I.
Net::FTP=GLOB(0x99cabe8)>>> PORT X,X,X,X,221,251
Net::FTP=GLOB(0x99cabe8)<<< 200 PORT command successful.
Net::FTP=GLOB(0x99cabe8)>>> ALLO 1442
Net::FTP=GLOB(0x99cabe8)<<< 502 ALLO command not implemented.
Net::FTP=GLOB(0x86d9be8)>>> QUIT
Net::FTP=GLOB(0x86d9be8)<<< 221 Goodbye.
Комментарии:
1. Вы не показали фактическое сообщение об ошибке, но я думаю, что это СЕРВЕР, который не реализует PASV.
2. ДА. Sever не реализует PASV. Но в этом коде, если я использую Passive=> 0, который отключит передачу pasv. В этом случае я получаю сообщение об ошибке «не удается отправить команду file ALLO, не найдена». Есть предложения, почему это происходит? как исправить эту ошибку?
3. $ f-> put(«abc.txt «) это возвращение ложно для меня! после ALLO он не отправил команду STOR
Ответ №1:
я получаю ошибку PASV command not implemented
В этом случае сервер не реализует PASV, поэтому вы не можете использовать пассивный режим, например, вы должны установить режим передачи в активный для передачи данных.
я получаю команду ALLO, которая не реализована
Также не реализовано сервером, но в этом случае вы можете спокойно игнорировать эту ошибку. ALLO используется просто для резервирования достаточного места для передачи файла, и многие серверы этого не реализуют. Следующая передача файлов все равно должна работать.
Редактировать: с Net::FTP 2.79 код возврата для ALLO больше не будет игнорироваться, но приведет к сбою, и передача не будет выполнена. Это означает, что серверы, которые неправильно реализуют RFC959 (FTP), перестанут работать, потому что в соответствии с этим RFC сервер, не нуждающийся в предварительном выделении хранилища с помощью ALLO, должен заставить эту команду вести себя так же, как NOOP, например, возвращать успех.
Комментарии:
1. При отправке файла возникает ошибка ALLO command not implemented. В этом случае он не отправит файл на ftp-сервер, верно?
2. @user3754887: нет, он все равно должен отправить файл, потому что Net::FTP знает, что ошибка с ALLO может быть проигнорирована. Отправка выполняется с помощью команды STOR, поэтому проверьте успешную команду STOR после ALLO в debug. Кроме того,
put
должен вернуть успех.3. $ f-> put(«abc.txt «) это возвращение ложно для меня!
4. @user3754887: не могли бы вы добавить выходные данные вашей программы к вашему вопросу с
Debug => 1
помощью (не DEBUG, а Debug). Это облегчило бы понимание того, что происходит.5. Я добавил вывод вместе с формулировкой проблемы. надеюсь, это будет полезно! и спасибо за уведомление «Debug».
Ответ №2:
Согласно perldoc, команда pasv_xfer активирует пассивный режим. С этой страницы:
pasv_xfer ( SRC_FILE, DEST_SERVER [, DEST_FILE ] ) This method will do a file transfer between two remote ftp servers. If "DEST_FILE" is omitted then the leaf name of "SRC_FILE" will be used.