Perl Net :: FTPSSL无法正常工作 - 尝试传输数据时超时

时间:2013-01-18 09:23:07

标签: perl cpan

我必须使用TLS将pure-ftpd的传输模式从常规ftp切换到ftp。 所以我已经将配置标志TLS切换为2(只有TSL,没有常规FTP)。

使用filezilla,文件的连接和传输工作正常。

现在我有一个perl脚本,它使用NET :: FTP从服务器获取一些文件。

这是主要功能:

use Net::FTP;

$ftp = Net::FTP->new("[SERVERNAME]", Debug => 1)
  or die "Cannot connect to [SERVERNAME]: $@";

$ftp->login("[USER]",'[PASSWORD]')
  or die "Cannot login ", $ftp->message;

$ftp->cwd("/")
  or die "Cannot change working directory ", $ftp->message;

$ftp->dir("/")
  or die "get failed ", $ftp->message;

$ftp->get("somefile.txt")
  or die "get failed ", $ftp->message;

$ftp->quit;

为了重建GET功能,我尝试将CPAN模块NET :: FTPSSL与以下脚本snipplet一起使用:

use Net::FTPSSL;

  my $ftps = Net::FTPSSL->new('[SERVERNAME]', 
                  Port => 21,
                              Encryption => EXP_CRYPT,
                  Croak => 1,
                  Trace => 1,
                              Debug => 2
                  )
    or die "Can't open [SERVERNAME]\n$Net::FTPSSL::ERRSTR";
  $ftps->login('[USER]', '[PASSWORD]') 
    or die "Can't login: ", $ftps->last_message();

  $ftps->cwd("/anyfolder") or die "Can't change directory: " . $ftps->last_message();
  $ftps->quot("PASV");
  $ftps->nlst() or die "Error: " . $ftps->last_message();
  $ftps->list("/anyfolder") or die "Can't change directory: " . $ftps->last_message();
  $ftps->binary() or die "Can't change directory: " . $ftps->last_message();
  $ftps->put("anyfile.txt") or die "Can't get file: " . $ftps->last_message();
  $ftps->get("anyfile.txt") or die "Can't get file: " . $ftps->last_message();

  $ftps->quit();

此脚本在身份验证过程中运行正常。 当涉及到文件传输时,它会停止,直到达到常规timeaut。

脚本的调试输出如下所示:

  

SKT<<< 220-欢迎使用Pure-FTPd。 SKT<<< 220-你是1号用户   100允许。 SKT<<< 220-这是一个私人系统 - 没有匿名登录   SKT<<<此服务器也欢迎220-IPv6连接。 SKT<<<   220您将在15分钟不活动后断开连接。 SKT>>>   AUTH TLS SKT<<< 234 AUTH TLS OK。

     
    
      
        

USER ++++++++<<<< 331用户< ++++++好。要求输入密码         通过 * <<< 230-用户< ++++++具有组访问权限:100<<< 230-该服务器支持FXP传输<<< 230好的当前目录         是/         CWD / rollout<<< 250好的。当前目录是/ anyfolder         PASV<<< 227进入被动模式( ,27,254)         PBSZ 0<<< 200 PBSZ = 0         PROT P<<< 200数据保护级别设置为"私有"         PASV<<< 227进入被动模式( ,145,153)         ---主持人( )端口(37273)         NLST

      
    
  

因此可以使用filezilla与服务器连接,但无法连接到服务器并使用脚本传输文件。

我知道这很可能不大,但我目前无法找到错误。

3 个答案:

答案 0 :(得分:0)

我有一个类似的问题从Net :: FTP切换到Net :: FTPSSL,我发现传递带有相同远程地址的OverridePASV参数修复了它。

答案 1 :(得分:0)

所以,你已经说过你尝试过OverridePASV,这没有用。通常,这是明显的修复,因为几个FTP服务器在PASV命令的答案中错误地返回其IP地址。如果他们在防火墙等后面,他们的外向IP地址不是他们返回的地址。

由于您正在通过WAN与服务器通信,而不是内部LAN,因此将PASV连接设置为IP地址,只需挂起即可。使用OverridePASV时,可以强制被动连接使用WAN IP地址(即用于连接它的地址)。

鉴于OverridePASV无法正常工作,问题更可能是您的FTP服务器位于不允许被动连接完成的防火墙后面(即FTP服务器设置的端口没有#&# 39;从WAN端口转发)或FTP服务器不支持被动。 Net :: FTPSSL只做被动(至少是我看到的代码版本,标记为0.31)。如果您正在与之通话的FTP服务器不支持PASV,或者您无法通过被动端口,则连接通常会挂起,直到超时为止。 FileZilla很可能使用PORT而不是PASV,这就是它工作的原因。

答案 2 :(得分:0)

$ ftps-> quot(“ PASV”);

quot将文本发送到服务器以获取Net :: FTPSSL中不存在的功能。

PASV改变了服务器的工作方式,但是由于“ quot”,客户端不在乎。

如果要PASV运行,则必须在NET :: FTPSSL中创建一个新命令。

此新命令必须:

  1. 将“ PASV”发送到服务器,然后
  2. 配置客户端以将其用作DATA连接的服务器。

net :: ftpssl使用仅用于客户端模式的DATA连接库。