我必须使用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与服务器连接,但无法连接到服务器并使用脚本传输文件。
我知道这很可能不大,但我目前无法找到错误。
答案 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中创建一个新命令。
此新命令必须:
net :: ftpssl使用仅用于客户端模式的DATA连接库。