Можем ли мы получить ответ при передаче файла 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" в командном файле, чтобы получить желаемую функциональность.
Три вопроса:
<command_file
не работает,-f command_file
делает,- некоторые сообщения отправляются в STDERR, поэтому нам нужно перенаправить, чтобы перехватить все, и
- как указано @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!