2009-06-08 84 views
1

我原來的腳本如下:爲什麼不在Perl的污染模式下打開管道?

my $cmd = "dir"; 
open (H, "$cmd |"); 
my @result = <H>; 
close (H); 
print STDERR @result,"\n"; 

這個腳本工作正常。如果我在腳本中添加以下行,它將無法工作:

$ENV{"LD_LIBRARY_PATH"} = "/opt/VRTSsfmh/lib"; 
$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin"; 
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; 

Perl在調用管道打開時會使用什麼?

加入以下代碼的固定問題:

if ($^O =~ /Win32/i) 
{ 
    $ENV{'SystemRoot'} =~ /([A-Z]:(\\[A-Za-z0-9_]+)+)/; 
    my $system32_dir = $1."\\system32"; 
    $ENV{'PATH'} = $system32_dir; 
} 
+1

當說什麼「失敗」時,通常會幫助描述失敗的更多細節。例如,它是否會產生錯誤消息,如果是,那麼該消息是什麼? – pjf 2009-06-08 13:39:42

回答

7

你的問題沒有真正涉及到污染模式。您設置了

$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin"; 

這些目錄通常不存在於Windows機器上。 dir是cmd.exe的內部命令,這樣一來就能來執行,你需要添加它駐留到路徑的目錄。

現在,請注意,你去這樣做的方式違背了路徑設置已知確切位置的整點。這是絕對有可能的惡意用戶改變這個環境變量指向他的dir危險的版本。

如果您依賴任何shell內置函數,Windows不一定安裝在C:\ Windows中的事實使在Windows上編寫一個安全的腳本變得複雜。

編輯:這是一個短的測試程序,你可以作爲基線使用:

#!/usr/bin/perl -T 

use strict; 
use warnings; 

$ENV{PATH} = join(';', qw(C:\Windows C:\Windows\System32)); 
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; 

open my $pipe_h, '-|', 'dir' 
    or die "Cannot open pipe to dir: $!"; 

print while <$pipe_h>; 

close $pipe_h 
    or die "Cannot close pipe to dir: $!"; 

__END__ 

C:\Temp> perl -T v.pl 

... 

2009/05/25 08:58 AM    3,584 zzz.exe 
       64 File(s)  32,125,365 bytes 
       14 Dir(s) 39,251,894,272 bytes free 

基本上,你需要的是系統管理員進行硬編碼在安裝時可以接受的路徑和不信任的用戶對腳本沒有寫權限。

+0

感謝您的回覆,這是來自unix樹的代碼。您可以忽略該代碼。即使我只是添加下面的行刪除@ENV { 'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; 我的代碼停止工作。 – Avinash 2009-06-08 13:21:08

相關問題