【问题标题】:Can we get response in LFTP file transfer through perl我们可以通过 perl 在 LFTP 文件传输中获得响应吗
【发布时间】:2019-02-03 20:39:07
【问题描述】:

我是 LFTP 的新手,正在尝试使用 LFTP 通过 perl 代码自动传送文件。我能够设置代理服务器并连接到远程主机,还能够使用 perl 代码成功地将文件传输到远程主机。但是我无法从 lftp transfer 获得响应,这可以让我的 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 时,我根本没有得到任何响应。

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

【问题讨论】:

  • 你为什么不用Net::FTP
  • Net :FTP 没有选择代理设置。只有在没有代理的情况下才有效。
  • 可能是 'expect' 程序可以处理的事情?
  • 尝试在命令文件中添加“set interactive yes”。
  • 问题是不是命令行不正确?我刚刚在我的 Linux bash 上尝试了 lftp 4.8.4,但无法让 &lt;command_file 工作。只有-f command_file 有效。

标签: perl ftp file-transfer lftp


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    三个问题:

    1. &lt;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!
    

    【讨论】:

    • 更新了我的代码示例并在我本地的 LInux 机器上进行了验证。
    猜你喜欢
    • 2013-07-08
    • 2013-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多