我们可以通过perl在LFTP文件传输中获得响应吗?

时间:2019-02-03 20:39:08

标签: perl ftp file-transfer lftp

我是LFTP的新手,正尝试使用LFTP通过perl代码自动执行文件传输。我可以设置代理服务器并连接到远程主机,也可以使用perl代码将文件成功传输到远程主机。但是我无法从lftp传输获得响应,这会使我的perl作业知道传输已成功完成,因为考虑到传输存在一些问题,因此我的perl作业失败了。我也尝试了详细选项,但是使用lftp传输文件时它也没有显示任何响应。

open(FTP,"lftp -vvv <command_file |")

command_file具有以下代码行:

set ftp:proxy http://proxy_server:port
open ftp://remote_server_name
user user_name password
cd /remote_server_dir
put /local_server_file_name -o remote_server_file_name

现在,在调用此代码“ FTP”之后,文件已成功传输到远程主机,但要验证它是否成功,我正在使用以下代码:

while(<FTP>)
{
   print $_;
   if ((/transferred/))
   {
      # successful
   }
   else
   {
      # not successful
   }
}

在手动执行时,LFTP会给出类似300 bytes transferred的响应。因此,我尝试使用关键字transferred作为成功转移的标志。但是似乎在通过perl运行此LFTP时,我根本没有任何响应。

请让我知道如何通过自动作业成功传输文件后如何从远程服务器获取响应。 谢谢!

2 个答案:

答案 0 :(得分:1)

我必须在命令文件中使用“set cmd:verbose yes”才能获得所需的功能。

答案 1 :(得分:0)

三个问题:

  1. <command_file不起作用,-f command_file起作用,
  2. 一些消息发送到STDERR,因此我们需要重定向以捕获所有消息,并且
  3. @lav指出,如果STDOUT不是tty,则需要手动启用交互模式

更新了complete code example

#!/usr/bin/perl
use strict;
use warnings;

my $successful;

# redirect STDERR to STDOUT: some messages go to STDERR!
if (open(my $ftp_fh, "lftp -vvv -f dummy.txt 2>&1 |")) {
    while(<$ftp_fh>) {
        print;
        $successful++ if / transferred$/;
    }

    close($ftp_fh)
        or die "lftp command failed: $!\n";

} else {
    die "lftp execution failed\n";
}

print "File transfer ", ($successful ? "" : "not "), "successful!\n";

exit 0;

这是我的命令文件:

set interactive yes
set xfer:clobber yes
open ftp://ftp.funet.fi
user Anonynmous test@does.not.exist.com
cd /pub/linux/kernel/v4.x
get sha256sums.asc

试运行:

$ perl dummy.pl
cd ok, cwd=/pub/linux/kernel/v4.x
288261 bytes transferred
File transfer successful!