2009-06-08 1 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에 안전하지 않은 스크립트를 작성하는 것을 복잡하게 만듭니다. 편집

:

#!/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

답장을 보내 주신다면, 그것이 유닉스 트리의 코드입니다. 해당 코드는 무시할 수 있습니다. 단지 다음 줄을 추가하더라도 @ENV { 'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; 코드가 작동하지 않습니다. – Avinash