リストし、mtimeを取得してから、ファイル(mtimeに基づく)を取得するための簡単なPerlスクリプトを作成しました。これは、RHEL5/6で利用可能なPerlNet::FTPモジュールを使用して行われました。
私の問題は、HTTP squidプロキシ(FTPプロキシではない)の背後にあるファイルを転送するために、このスクリプトを適応させる必要があることです。
これらのプログラムに関連するプロキシ構成ファイルを設定した後、wgetやlftpなどのLinuxシェルコマンドを使用すると、ファイルをftpできます。
system(shell)コマンドを呼び出さずにPerlでこれを行う方法はありますか?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でそれらを取得することの両方を達成するための最良の方法は何か疑問に思っています。
ありがとう
ポール