【问题标题】:Perl Net::FTP package PASV Command not implementedPerl Net::FTP 包 PASV 命令未实现
【发布时间】:2014-06-20 03:17:11
【问题描述】:

我用 perl 编写了下面的 FTP 客户端程序。在一台服务器上执行良好。如果我尝试在不同的服务器上执行相同的操作,我会收到 PASV 命令未实现错误。如果我在 FTP 构造函数中给出 Passive=>0,我将得到未实现的 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 in\n", $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.

【问题讨论】:

  • 您没有显示实际的错误消息,但我认为是没有实现 PASV 的 SERVER。
  • 是的。服务器未实施 PASV。但是在这段代码中,如果我使用 Passive=>0 这将关闭 pasv 传输。在这种情况下,我收到“无法发送文件 ALLO 命令未找到”错误。有什么建议为什么会来吗?如何纠正这个错误?
  • $f->put("abc.txt") 这对我来说返回 false!在 ALLO 之后它没有发送 STOR 命令

标签: perl


【解决方案1】:

我收到 PASV 命令未实现错误

在这种情况下,服务器没有实现 PASV,所以你不能使用被动模式,例如您必须将传输模式设置为活动才能传输数据。

我得到 ALLO 命令未实现

服务器也没有实现,但是在这种情况下你可以放心地忽略这个错误。 ALLO 只是用来为文件传输保留足够的空间,许多服务器没有实现这一点。以下文件传输应该仍然有效。

编辑:在 Net::FTP 2.79 中,ALLO 的返回码将不再被忽略,但会导致失败并且不会完成传输。这意味着,未正确实现 RFC959 (FTP) 的服务器将停止工作,因为根据此 RFC,不需要使用 ALLO 预分配存储的服务器应该使此命令的行为与 NOOP 相同,例如返回成功。

【讨论】:

  • 发送文件时发生 ALLO command not implemented 错误。在这种情况下它不会将文件发送到 ftp 服务器对吗?
  • @user3754887:不,它仍然应该发送文件,因为 Net::FTP 知道可以忽略 ALLO 的错误。发送是通过 STOR 命令完成的,因此在调试中的 ALLO 之后检查成功的 STOR 命令。此外,put 应该返回成功。
  • $f->put("abc.txt") 这对我来说返回 false!
  • @user3754887:您能否将程序的输出添加到您的问题中,Debug =&gt; 1(不是调试,而是调试)。这样可以更轻松地查看正在发生的事情。
  • 我将输出与问题陈述一起添加。希望它会有所帮助!并感谢您通知“调试”。
【解决方案2】:

根据 perldoc,pasv_xfer 命令将激活被动模式。来自that page

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.

【讨论】:

    猜你喜欢
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    相关资源
    最近更新 更多