¿Por qué no hace una obra abierta tubería bajo el modo de mancha de Perl?

StackOverflow https://stackoverflow.com/questions/964426

  •  12-09-2019
  •  | 
  •  

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;
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top