2011-06-10 56 views
0

我有一個存在的程序,它接受一個目錄路徑並遞歸地處理這個目錄及其文件。我需要將此代碼更改爲使用遠程系統上的目錄,因此例如流程如下:在perl中通過rsh處理文件

---這裏我按照需要從unix系統訪問遠程目錄的文件名

----執行process_directory

---子process_directory #takes到目錄的路徑

回答

0

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

  • 安裝fuse
  • 通過sshfs的
  • 掛載遠程目錄使用腳本在安裝目錄 - (腳本會認爲這是一個本地目錄)
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 

如果沒有,那麼它變得有點混亂(警告,未經測試,情況因人而異,需要注意的程序員等)...

#!/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是否以相同大小開始),確保遠程文件中沒有嵌入的「非標準」字符/目錄名稱可能最終會與構建的命令以及其他許多命令混淆。請考慮在何處運行以及觸發器之前的類型和類型。

如果你填寫更多關於你想要做什麼的細節,我可能會更接近你所需要的。不過,這將有助於你開始。 :-)