2009-06-08 7 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

答えて

7

あなたの質問は本当にモードを汚染チェックするためには関係ありません。設定する

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

これらのディレクトリは、通常、Windowsマシンには存在しません。 dirはcmd.exeの内部コマンドですので、そのコマンドを実行できるようにするには、パスが存在するディレクトリを追加する必要があります。

ここで、あなたがそれをやり遂げる方法は、既知の明確な場所へのパスを設定する全体の点と矛盾することに注意してください。悪意のあるユーザーが危険なバージョンdirを指すようにこの環境変数を変更することは間違いなく可能です。

Windowsが必ずしもC:\ Windowsにインストールされているわけではないという事実は、シェル組み込み関数のいずれかを使用している場合、Windows上で汚れに対して安全なスクリプトを書くことを複雑にします。

EDIT:ここは、あなたがベースラインとして使用することができ、短いテストプログラムです:

#!/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'、 'C​​DPATH'、 'ENV'、 'BASH_ENV'}を削除しても、 コードが機能しなくなりました。 – Avinash

0

テントモードが複雑です。あなたは本当にperldoc perlsecを読んで理解する必要があります。問題はCleaning Up Your Pathセクションの最初の文で扱われます。

関連する問題