Por que não faz um tubo de trabalho aberto no modo de mancha de Perl?
Pergunta
O meu roteiro original é a seguinte:
my $cmd = "dir";
open (H, "$cmd |");
my @result = <H>;
close (H);
print STDERR @result,"\n";
Este script funciona bem. Se eu adicione o seguinte linha ao script, ele não consegue trabalho:
$ENV{"LD_LIBRARY_PATH"} = "/opt/VRTSsfmh/lib";
$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin";
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
O que uso Perl quando aberta tubo é chamado?
A adição de código a seguir corrigiu o problema:
if ($^O =~ /Win32/i)
{
$ENV{'SystemRoot'} =~ /([A-Z]:(\\[A-Za-z0-9_]+)+)/;
my $system32_dir = $1."\\system32";
$ENV{'PATH'} = $system32_dir;
}
Solução
A sua questão não é realmente relacionado com o modo de mácula. Você define
$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin";
Esses diretórios normalmente não existe em uma máquina Windows. dir
é um comando interno cmd.exe de modo a ser capaz de executar isso, você precisa adicionar o diretório onde ele reside, para o caminho.
Agora, nota que a maneira como você vai fazer sobre isso contradiz todo o ponto de definir o caminho para locais definitivos conhecidos. É definitivamente possível para um usuário nefasto para mudar esta variável de ambiente para apontar para sua versão perigosa de dir
.
O fato de que o Windows não é necessariamente instalado em C:. \ Windows complica escrevendo um script mancha-safe no Windows se você confiar em qualquer um dos builtins shell
EDIT: Aqui está um pequeno programa de teste que você pode usar como uma linha de base:
#!/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
Basicamente, o que você precisa é para o administrador do sistema para codificar o caminho aceitável no momento da instalação e para os usuários não confiáveis ??não ter permissões de gravação no script.
Outras dicas
Taint é complicado. Você realmente deve ler e entender perldoc perlsec
. Seu problema é abordado na primeira frase do limpar o seu caminho seção.