Perl Net :: Команда PASV FTP-пакета не реализована

#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.