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

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

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


person Perl_Devloper    schedule 03.02.2019    source источник
comment
Почему вы не используете Net :: FTP?   -  person choroba    schedule 03.02.2019
comment
Сеть: FTP не принимает настройки прокси. Он работает, только если прокси нет.   -  person Perl_Devloper    schedule 03.02.2019
comment
Может быть, с чем-то справится программа "expect"?   -  person Kim Ryan    schedule 04.02.2019
comment
Попробуйте добавить интерактивное да в командный файл.   -  person lav    schedule 04.02.2019
comment
Может быть проблема в неправильной командной строке? Я только что попробовал lftp 4.8.4 на своем Linux bash и не смог заставить <command_file работать. Только -f command_file работает.   -  person Stefan Becker    schedule 04.02.2019
comment
Привет, моя проблема была исправлена ​​с помощью решения @lav. Добавление set interactive yes в command_file опубликовало вывод. Спасибо!   -  person Perl_Devloper    schedule 05.02.2019


Ответы (2)


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

person Majak    schedule 21.03.2021

Три вопроса:

  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 [email protected]
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!
person Stefan Becker    schedule 04.02.2019
comment
Обновил мой пример кода и проверил его на моем локальном компьютере LInux. - person Stefan Becker; 04.02.2019