0

ディレクトリパスを取得し、ディレクトリとそのファイルを再帰的に処理する既存のプログラムがあります。リモートシステムのディレクトリを使用するようにこのコードを変更する必要があるため、たとえばフローは次のようになります。

---ここでは、UNIX システムからアクセスするために必要なリモート ディレクトリのファイル名を取得するプロセスを実行します。

----process_directory を実行

---sub process_directory #ディレクトリへのパスを取る

4

2 に答える 2

0

最初に言及する必要があると感じたのは、これらすべてが実際には rsh/rcp ではなく ssh/scp を介して行われる必要があるということです。多分あなたがいる場所ではそれは選択肢ではないかもしれませんが、少なくともここでそれについて何か言わなければ、今夜は眠れません. :-) そうは言っても、残りの部分はどちらを使用しても同じように適用されます。

他に多くの詳細がないため、ここではある程度知識に基づいた推測を行います。制約に応じて、あなたがしていることについて私が見ることができる2つの可能な操作モードがあります。

最初の可能性は、スクリプトが問題のリモート ホストに「出荷」されている可能性があることです。その場合、カバーしたいすべてのホストのリストを作成してから、次のようにします。

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 が同じサイズで始まることを確認し)、リモート ファイルに「非標準」文字が埋め込まれていないことを確認します。構築されたコマンドを台無しにする可能性のある/ディレクトリ名、およびその他の任意の数。トリガーを引く前に、これが実行される場所、ファイルの種類、およびその他について考えてください。

あなたがしようとしていることについてより詳細に記入していただければ、私はあなたが必要とするものに近づくことができるかもしれません. ただし、これで開始できることを願っています。:-)

于 2011-06-11T01:31:56.103 に答える
0

本当に欲しいものはわかりませんが、次のことができます。

  • ヒューズを取り付ける
  • sshfs 経由でリモート ディレクトリをマウントする
  • マウントされたディレクトリでスクリプトを使用します-(スクリプトはそれがローカルディレクトリであると認識します)
于 2011-06-10T20:41:22.777 に答える