2009-06-08 6 views
1

Mon script original est la suivante:Pourquoi un tuyau ne fonctionne-t-il pas sous le mode d'altération de Perl?

my $cmd = "dir"; 
open (H, "$cmd |"); 
my @result = <H>; 
close (H); 
print STDERR @result,"\n"; 

Ce script fonctionne très bien. Si j'ajoute la ligne suivante au script, il ne fonctionne pas:

$ENV{"LD_LIBRARY_PATH"} = "/opt/VRTSsfmh/lib"; 
$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin"; 
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; 

Que Perl utilise-t-il lorsque le canal ouvert est appelé?

Ajout du code ci-dessous résolu le problème:

if ($^O =~ /Win32/i) 
{ 
    $ENV{'SystemRoot'} =~ /([A-Z]:(\\[A-Za-z0-9_]+)+)/; 
    my $system32_dir = $1."\\system32"; 
    $ENV{'PATH'} = $system32_dir; 
} 
+1

Lorsque vous dites que quelque chose «ne fonctionne pas», il est généralement utile de décrire comment cela échoue plus en détail. Par exemple, produit-il un message d'erreur, et si oui, quel est ce message? – pjf

Répondre

7

Votre question n'est pas vraiment lié à entacher le mode. Vous avez défini

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

Ces répertoires n'existent normalement pas sur une machine Windows. dir est une commande interne de cmd.exe afin de pouvoir l'exécuter, vous devez ajouter le répertoire où il réside au chemin. Maintenant, notez que la façon dont vous allez le faire contredit tout le point de placer le chemin vers des emplacements définis connus. Il est certainement possible pour un utilisateur infâme de changer cette variable d'environnement pour pointer vers sa version dangereuse de dir. Le fait que Windows ne soit pas nécessairement installé dans C: \ Windows complique l'écriture d'un script de sécurité sur Windows si vous comptez sur l'un des composants internes du shell.

EDIT: Voici un programme de test que vous pouvez utiliser comme base de référence:

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

Fondamentalement, ce que vous avez besoin est pour l'administrateur système pour coder en dur le chemin acceptable au moment de l'installation et pour les utilisateurs non fiables ne pas avoir d'autorisations d'écriture sur le script.

+0

Merci Pour votre réponse, c'est le code provenant de l'arborescence Unix. Vous pouvez ignorer ce code. même si j'ajoute juste les lignes suivantes, supprimez @ENV {'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; mon code ne fonctionne plus. – Avinash

0

Le mode de salissure est compliqué. Vous devez vraiment lire et comprendre perldoc perlsec. Votre problème est abordé dans la première phrase de la section Cleaning Up Your Path.

Questions connexes