我用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.发布于 2014-06-19 04:37:35
我得到PASV命令没有实现错误
在这种情况下,服务器不实现PASV,因此不能使用被动模式,例如,必须将传输模式设置为主动传输数据。
我让ALLO命令没有得到执行
也不是由服务器实现的,但在这种情况下,您可以安全地忽略此错误。ALLO只是用来为文件的传输预留足够的空间,而很多服务器并没有实现这一点。下面的文件传输应该仍然有效。
编辑:使用Net::FTP 2.79,ALLO的返回代码将不再被忽略,但是会导致失败,并且传输不会被完成。这意味着,没有正确实现RFC959 (FTP)的服务器将停止工作,因为根据该RFC,不需要预先使用ALLO分配存储的服务器应该使此命令的行为与NOOP相同,例如返回成功。
发布于 2014-06-19 04:07:21
根据perldoc,pasv_xfer命令将激活被动模式。来自那一页
pasv_xfer ( SRC_FILE,DEST_SERVER,DEST_FILE )这种方法将在两个远程ftp服务器之间进行文件传输。如果省略"DEST_FILE“,则使用"SRC_FILE”的叶名。
https://stackoverflow.com/questions/24298558
复制相似问题