我有一個存在的程序,它接受一個目錄路徑並遞歸地處理這個目錄及其文件。我需要將此代碼更改爲使用遠程系統上的目錄,因此例如流程如下:在perl中通過rsh處理文件
---這裏我按照需要從unix系統訪問遠程目錄的文件名
----執行process_directory
---子process_directory #takes到目錄的路徑
我有一個存在的程序,它接受一個目錄路徑並遞歸地處理這個目錄及其文件。我需要將此代碼更改爲使用遠程系統上的目錄,因此例如流程如下:在perl中通過rsh處理文件
---這裏我按照需要從unix系統訪問遠程目錄的文件名
----執行process_directory
---子process_directory #takes到目錄的路徑
不知道你真正想要的,但你可以:
第一件事,我覺得有必要一提的是所有這些都應該通過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
如果沒有,那麼它變得有點混亂(警告,未經測試,情況因人而異,需要注意的程序員等)...
#!/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是否以相同大小開始),確保遠程文件中沒有嵌入的「非標準」字符/目錄名稱可能最終會與構建的命令以及其他許多命令混淆。請考慮在何處運行以及觸發器之前的類型和類型。
如果你填寫更多關於你想要做什麼的細節,我可能會更接近你所需要的。不過,這將有助於你開始。 :-)