我必须使用 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 与服务器连接,但无法连接到服务器并使用脚本传输文件。
我知道这很可能不是一件大事,但我目前无法找到错误。