обрабатывать файлы через rsh в perl - PullRequest
0 голосов
/ 11 июня 2011

У меня есть существующая программа, которая берет путь к каталогу и рекурсивно обрабатывает этот каталог и его файлы.Мне нужно изменить этот код, чтобы использовать каталог в удаленной системе, например, поток выглядит так:

--- Здесь я делаю процесс, чтобы получить имя файла удаленного каталога, необходимое для доступа изunix system

---- выполнить каталог_процесса_процесса

--- подпапка_процесса_процесса # берет путь к каталогу

Ответы [ 2 ]

0 голосов
/ 11 июня 2011

Первое, что я считаю необходимым упомянуть, это то, что все это должно быть больше ssh / scp, а не rsh / rcp.Может быть, это не вариант, где вы находитесь, но я просто не смог бы спать сегодня вечером, если бы я не сказал здесь что-нибудь об этом.:-) При этом, остальная часть этого будет применяться одинаково хорошо, независимо от того, что вы используете.

Без многих других деталей, я сделаю здесь полуобразованное предположение.Существует два возможных режима работы, которые я вижу для того, что вы делаете, в зависимости от ваших ограничений.

Первая возможность заключается в том, что ваш скрипт может быть "доставлен" на рассматриваемый удаленный хост (ы).В этом случае составьте список всех хостов, которые вы хотите охватить, а затем:

bash$ for this_host in `cat file_of_hosts`; do
> rcp existing_script $this_host:/wherever/you/want/it/to/live
> rsh $this_host '/wherever/you/want/it/to/live/existing_script /remote/target/directory'
> done

Если нет, то он станет немного более грязным (предупреждение, непроверенный, ymmv, caveat programmer и т. Д.)...

#!/usr/bin/perl

# or change this to iterate over a file full of host/path pairs
my ($RemoteHost, $TargetDir) = @ARGV;
my $Temp = '/tmp';

sub ProcessRemoteDir {
    my ($host, $path) = @_;
    # the command is "ell ess space minus one capital eff"
    my $listCommand = "rsh $host 'ls -1F $path'";
    my @dirEntries = qx{ $listCommand };
    chomp(@dirEntries);

    foreach my $item (@dirEntries) {
         # If it ends in "/"
         if ($item =~ m/\/\Z/) {
              my $subDirectory = $path . "/" . $item;
              ProcessRemoteDir($host, $subDirectory);
         }
         # If it *isn't* a symlink, pipe, or socket
         elsif ($item !~ /(\@|\||\=)\Z/) {
              # in case one of the file's 'x' bits is set
              $item =~ s/\*\Z//;
              my $localCopy  = $Temp . "/" . $item;
              my $remoteCopy = $host . ":" . $path . "/" . $item;

              my $fetchCommand = "rcp $remoteCopy $localCopy";
              system($fetchCommand);

              # Your current file processing logic should go here, operating on $localCopy

              my $putCommand = "rcp $localCopy $remoteCopy";
              system($putCommand);
              unlink $localCopy;
         }
   }
}

ProcessRemoteDir($RemoteHost, $TargetDir);

__END__

Это первая глубина;не уверен, что это имело значение для вас.Также отметим, что в интересах краткости я пропустил почти ВСЕ проверки безопасности.Некоторые из них приходят на ум, проверяя результаты от вызовов system () и qx {}, проверяя, что $ localCopy не является нулевым байтом, изменяя $ listCommand (и обработку @dirEntries), чтобы проверить размеры файлов иразрешения и убедитесь, что они находятся в любых пределах, разумных в этом контексте и среде (и проверяя, что $ remoteCopy и $ localCopy начинаются с одинакового размера), гарантируя, что в удаленном файле нет встроенных «нестандартных» символов/ имена каталогов, которые могут в конечном итоге связываться с созданными командами и любым количеством других.Пожалуйста, подумайте о том, где это будет выполняться и какие типы файлов и еще много чего, прежде чем нажимать на триггер.

Если вы укажете больше деталей о том, что вы пытаетесь сделать, возможно, я смогу приблизитьсяк тому, что вам нужно.Надеюсь, это поможет вам начать.: -)

0 голосов
/ 11 июня 2011

Понятия не имею, что вы действительно хотите, но вы можете:

  • установить предохранитель
  • смонтировать удаленный каталог через sshfs
  • используйте ваш скрипт на смонтированном каталоге - (скрипт будет думать, что это локальный каталог)
...