通过Perl中的rsh处理文件

时间:2011-06-10 20:33:29

标签: perl rsh

我有一个现有程序,它采用目录路径并递归处理目录及其文件。我需要更改此代码以使用远程系统上的目录,因此例如流程如下:

---在这里,我根据需要从unix系统

获取远程目录的文件名

----执行process_directory

--- sub process_directory #takes到目录的路径

2 个答案:

答案 0 :(得分:0)

不知道你真正想要什么,但你可以:

  • 安装fuse
  • 通过sshfs
  • 安装远程目录
  • 在已安装的目录上使用您的脚本 - (脚本会认为它是本地目录)

答案 1 :(得分:0)

首先我觉得有必要提一下,所有这一切都应该超过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,警告程序员等)......

#!/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以相同大小开始),确保远程文件中没有任何嵌入的“非标准”字符/目录名称可能最终搞乱构造的命令,以及任何其他命令。在拉动扳机之前,请考虑一下这将运行的位置以及什么类型的文件和诸如此类的东西。

如果您填写有关您尝试做的更多详细信息,我可能会更接近您的需求。不过,这有望让你开始。 : - )