Чтение файла на удаленном хосте
Мой код включает в себя переход на хост (выполнение с openSSH), получение списка файлов, соответствующих шаблону (выполнение с использованием команды удаленного поиска-OpenSSH), а затем открытие каждого полученного файла и обработку каждого (grepping и т. Д.). Я закончил с получением имен файлов и передачей в функцию. Теперь я должен передать эти имена файлов в функцию, где я открываю каждое из них и обрабатываю его. Я пытаюсь сделать это с помощью File::Remote следующим образом:
sub processFiles{
my $fileList =shift;
#Iterate over the file and try to find start and stop time stamps from the file
for my $file ( @{$fileList}) {
#finding start time of file:its found in lines of file
my $HEAD;
open $HEAD, "host:head -1000 $File|" or die "Unable to check file for starting time";
while ( <$HEAD> ) {
#process...
Но я не могу открыть файл на хосте и получаю сообщение об ошибке.
2 ответа
Модуль File::Remote не является частью стандартной установки Perl. Если вы хотите использовать этот модуль, то вам необходимо установить его.
То, как вы его установите, будет зависеть от того, какую платформу вы используете и как вы установили Perl. На установке Linux, где вы используете систему Perl, вы можете попробовать sudo yum install perl-File-Remote
(в системе на основе RedHat) или sudo apt-get install libfile-remote-perl
(в системе на основе Debian/Ubuntu). Вы также можете попробовать использовать cpan или cpanm для его установки.
Я бы также предположил, что, поскольку этот модуль последний раз обновлялся в 2005 году, вполне вероятно, что он не поддерживается, поэтому я бы с осторожностью использовал его.
При выполнении удаленных действий в пакетном режиме, первый принцип заключается в уменьшении количества соединений ssh (в идеале только одно). Используя shell или perl one liner, вы можете выполнять очень сложные действия. Вот мое понимание вашей потребности:
ssh hostname 'find dirname -name \*.pl| xargs grep -l pattern /dev/null'
Вы можете передать дальнейшую обработку в той же строке. Если вы хотите обрабатывать файлы локально, вы можете передать все файлы одной командой. Вот полный пример:
use Archive::Tar;
open my $file, '-|', 'ssh -C hostname "find dirname -name \*.pl | xargs grep -l pattern /dev/null | xargs tar c"'
or die "Can't pipe: $!";
my $tar = Archive::Tar->new($file);
foreach my $file ($tar->get_files()) {
print $file->name, ', ', $file->size, "\n";
}