使用perl脚本中的retr - 'RETR'不被理解

时间:2010-12-01 22:02:10

标签: perl ftp

我有一个简单的任务,在我的公司,我们需要从ftp服务器下载文件,通常我有一些脚本,他们可以处理这个,但在一台服务器上我有一些问题。当我使用系统特定的ftp命令时,它可以正常下载,但是当我尝试从perl执行此操作时,我得到错误“'RETR'不理解”。

我的脚本看起来像这样

壳:

ftp> debug
ftp> open xx.xx.xx.xx
220 ProFTPD 1.3.0 Server (ProFTPD Default Installation) [xx.xx.xx.xx]
ftp> cd IN
---> CWD IN
250 CWD command successful
ftp> get somefile10112499xxx.ZIP
---> PORT 3,126,181,35,14,131
200 PORT command successful
---> RETR somefile10112499xxx.ZIP
150 Opening ASCII mode data connection for somefile10112499xxx.ZIP (13299 bytes)
226 Transfer complete.
ftp: 64d bajtów odebranych w 0,01Sekund 889,80Kbajtów/sek.
ftp> quit
---> QUIT
221 Goodbye.
perl脚本:

use Net::FTP;
$ftp = Net::FTP->new($FTP_HOST, Debug => 1,Passive=>0) ;
$ftp->login($FTP_USER,$FTP_PASS) ;
$ftp->retr("somefile10112499xxx.ZIP");
$ftp->quit;
我尝试使用被动模式,ascii和二进制传输方法,但所有这些都使“Net :: FTP = GLOB(0x1ee71a0)<<<< 500'RETR'无法理解”。

在命令ftp中是否默认定义了其他参数?也许我应该在perl脚本中做一些更改?

3 个答案:

答案 0 :(得分:1)

您是否有理由使用$ftp->retr()代替$ftp->get()来下载这些文件?通常使用Net::Ftp如果您只是下载文件,则使用

get ( REMOTE_FILE [, LOCAL_FILE [, WHERE]] )

方法。我相信retr()方法会返回对Net::FTP::dataconn对象的引用。

答案 1 :(得分:1)

您需要了解的有关FTP的信息是有一个客户端程序和一个服务器程序。客户端程序采用一组命令,服务器采用另一组站点命令。您的客户端可能会使用RETR并将其转换为远程服务器知道的内容。您回来的 500 来自那里的服务器。因此,无论您的本地客户端是否知道服务器将对“RETR”采取什么措施,服务器似乎都不了解该命令。这就是它告诉你的。

我破解了开放Net::FTP已经有一段时间了,但是如果我能记住很多不太常见的命令被传递给服务器。

答案 2 :(得分:0)

我找到了解决方案,问题不在下载脚本中,而是在FTP服务器上。该文件已从服务器中删除 - 出现了某种崩溃 - 这就是我无法下载的原因。

毕竟,似乎在脚本中有时我使用的是没有任何参数的get方法,这也返回500 'RETR' not understood。我认为这不酷,它应该告诉我没有这样的文件。

但我要感谢大家阅读和帮助。