我编写了一个简单的 Perl 脚本来列出,获取 mtime,然后获取文件(基于 mtime)。这是使用 RHEL5/6 中可用的 Perl Net::FTP 模块完成的。
我的问题是我现在必须调整这个脚本来传输位于 HTTP squid 代理(而不是 FTP 代理)后面的文件。
如果在为这些程序设置相关代理配置文件后使用 wget 或 lftp 等 Linux shell 命令,我可以 ftp 文件。
有没有办法在 Perl 中执行此操作而无需调用系统(shell)命令。我尝试设置 Net::FTP 防火墙选项(见下文),但我相信这仅适用于我们没有或不使用的 FTP 代理。
到目前为止,我的代码与此类似(为清楚起见,我省略了错误处理):
my $host = '111.111.111.111';
my $ftp_port = 21;
my $passive = 0; #Have also tried with passive mode on.
my $firewall = 'proxy.xx:3128';
my $debug = 1;
my $username = 'foo';
my $password = 'bah';
my $ftp = Net::FTP->new($host, Port=> $ftp_port, Passive => $passive, Firewall => $firewall, Debug => $debug);
$ftp->login($username, $password);
my @file_list = $ftp->ls;
foreach my $file (@file_list) {
my $mod_time = $ftp->mdtm($file);
if($mod_time + $wait_time <= time() ) {
$ftp->get($file);
}
}
$ftp->quit;
编辑:我收到的错误如下:
Net::FTP: new(111.111.111.111, Port => 21, Passive => 0, Firewall => proxy.xx:3128, Debug => 1)
Net::FTP>>> Net::FTP(2.77)
Net::FTP>>> Exporter(5.63)
Net::FTP>>> Net::Cmd(2.29)
Net::FTP>>> IO::Socket::INET(1.31)
Net::FTP>>> IO::Socket(1.31)
Net::FTP>>> IO::Handle(1.28)
Net::FTP=GLOB(0x2640e60): Timeout at /etc/transfer/transfer_get.pl line 106
如果我打开被动模式,我会得到同样的错误。如果我不提供防火墙选项,我也会收到类似的超时错误:
Net::FTP: new(111.111.111.111, Port => 21, Passive => 1, Debug => 1)
main crashed: Can't ftp to 111.111.111.111: Net::FTP: connect: Connection timed out
在阅读 Net::FTP 上的手册后,我非常确定它不支持通过 http 代理进行传输。只是想知道实现列出远程文件的 mtime 然后在 Perl 中获取它们的最佳方法是什么。
谢谢
保罗