1

我必须使用 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 与以下脚本片段一起使用:

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

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

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

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

4

3 回答 3

0

I had a similar problem switching from Net::FTP to Net::FTPSSL, and I found that passing the OverridePASV parameter with the same remote address fixed it.

于 2013-01-18T14:26:01.130 回答
0

因此,您已经说过您尝试过 OverridePASV,但没有成功。通常,这是显而易见的解决方法,因为几个 FTP 服务器在 PASV 命令的响应中错误地返回了它们的 IP 地址。如果它们位于防火墙等后面,则它们的外向 IP 地址不是它们返回的 IP 地址。

由于您是从广域网而不是内部局域网与服务器交谈,因此将 PASV 连接设置到它为您提供的 IP 地址只会挂起。当您使用 OverridePASV 时,您可以强制被动连接使用 WAN IP 地址(即您用来连接它的地址)。

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

于 2017-06-29T14:52:49.333 回答
0

$ftps->quot("PASV");

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

PASV 改变了服务器的工作方式,但是因为“quot”,客户端并不在意。

如果你想让 PASV 工作,你必须在 NET::FTPSSL 中创建一个新命令。

这个新命令必须:

  1. 将“PASV”发送到服务器,并且
  2. 将客户端配置为作为 DATA 连接的服务器。

net::ftpssl 使用仅在客户端模式下工作的 DATA 连接库。

于 2019-01-11T15:25:07.760 回答