¿Por qué no hace una obra abierta tubería bajo el modo de mancha de Perl?
Pregunta
Mi guión original es el siguiente:
my $cmd = "dir";
open (H, "$cmd |");
my @result = <H>;
close (H);
print STDERR @result,"\n";
Este guiones funciona bien. Si añado siguiente línea al guión, que no funciona:
$ENV{"LD_LIBRARY_PATH"} = "/opt/VRTSsfmh/lib";
$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin";
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
¿Qué usa Perl cuando se abre la tubería se llama?
La adición de siguiente código ha solucionado el problema:
if ($^O =~ /Win32/i)
{
$ENV{'SystemRoot'} =~ /([A-Z]:(\\[A-Za-z0-9_]+)+)/;
my $system32_dir = $1."\\system32";
$ENV{'PATH'} = $system32_dir;
}
Solución
Su pregunta no está muy relacionado con el modo de echar a perder. Define
$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin";
Estos directorios no existen normalmente en una máquina Windows. dir
es un comando interno cmd.exe así que para ser capaz de ejecutar eso, es necesario añadir el directorio donde reside el camino.
Ahora, tenga en cuenta que la forma en que se puede ir haciendo que contradice todo el punto de ajuste de la ruta de acceso a ubicaciones definidas conocidas. En definitiva, es posible que un usuario nefasto para cambiar esta variable de entorno para que apunte a su versión peligrosa de dir
.
El hecho de que Windows no es necesariamente instalado en C:. \ Windows complica escribir un guión mancha de fallos en Windows si se basan en cualquiera de los órdenes internas
EDIT: Este es un pequeño programa de prueba se puede utilizar como punto de referencia:
#!/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
Básicamente, lo que necesita es que el administrador del sistema para codificar el camino aceptable durante la instalación y para los usuarios que no se confía no tiene permisos de escritura en el guión.
Otros consejos
modo Taint es complicado. Que realmente debe leer y entender perldoc perlsec
. Su problema se aborda en la primera frase de la la limpieza de su trayectoria sección.