Первое, что я считаю необходимым упомянуть, это то, что все это должно быть больше 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 начинаются с одинакового размера), гарантируя, что в удаленном файле нет встроенных «нестандартных» символов/ имена каталогов, которые могут в конечном итоге связываться с созданными командами и любым количеством других.Пожалуйста, подумайте о том, где это будет выполняться и какие типы файлов и еще много чего, прежде чем нажимать на триггер.
Если вы укажете больше деталей о том, что вы пытаетесь сделать, возможно, я смогу приблизитьсяк тому, что вам нужно.Надеюсь, это поможет вам начать.: -)