我的原始脚本是如下:

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;
}
有帮助吗?

解决方案

您的问题没有真正涉及到污染模式。设置

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

这些目录通常不会在Windows机器上存在。 dir是cmd.exe的内部命令,以便以能够执行的是,需要添加它驻留到路径的目录。

现在,请注意,你去这样做的方式违背了路径设置已知确切位置的整点。这是绝对有可能的恶意用户改变这个环境变量指向他dir危险的版本。

这视窗不一定安装在C事实:\ Windows下编写复杂Windows上的污点安全的脚本,如果你依赖任何shell内建的

修改这里是你可以作为基线使用短的测试程序:

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

基本上,你需要的是系统管理员硬编码路径接受在安装时并不可信用户不要对脚本的写权限。

其他提示

污染模式是复杂的。你真的必须阅读并理解 perldoc perlsec 。你的问题是在的第一句话清理你的路径部分。

scroll top