Можем ли мы получить ответ при передаче файла LFTP через perl

Я новичок в LFTP и пытаюсь автоматизировать доставку файлов через Perl-код, используя LFTP. Я могу установить прокси-сервер и подключиться к удаленному хосту, а также успешно перенести файл на удаленный хост, используя код 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 как признак успешной передачи. Но кажется, что при запуске этого LFTP через Perl я не получаю никакого ответа вообще.

Пожалуйста, дайте мне знать, как получить ответ от удаленного сервера после успешной передачи файла через автоматизированное задание. Спасибо!

2 ответа

Мне пришлось использовать "set cmd:verbose yes" в командном файле, чтобы получить желаемую функциональность.

Три вопроса:

  1. <command_file не работает, -f command_file делает,
  2. некоторые сообщения отправляются в STDERR, поэтому нам нужно перенаправить, чтобы перехватить все, и
  3. как указано @lav, вам нужно включить интерактивный режим вручную, если STDOUT не tty

Обновлен полный пример кода:

#!/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!
Другие вопросы по тегам