Можем ли мы получить ответ при передаче файла LFTP через perl - PullRequest
0 голосов
/ 03 февраля 2019

Я новичок в 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 я не получаю никакого ответа.

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

1 Ответ

0 голосов
/ 04 февраля 2019

Три проблемы:

  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!
...