Question

Mon script original se présente comme suit:

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

Ce script fonctionne très bien. Si j'ajoute 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'};

Qu'est-ce que l'utilisation de Perl lorsque l'ouverture du tube est appelé?

Ajout de code suivant 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;
}
Était-ce utile?

La solution

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

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

Ces répertoires n'existent pas normalement sur une machine Windows. dir est une commande interne cmd.exe afin de pouvoir exécuter, vous devez ajouter le répertoire où il se trouve sur le chemin.

Maintenant, notez que la façon dont vous allez faire cela en contradiction avec le point de l'ensemble de la définition du chemin à des endroits précis connus. Il est certainement possible pour un utilisateur malfaisant pour modifier cette variable d'environnement pour pointer sa version dangereuse de dir.

Le fait que Windows est pas nécessairement installé dans C:. \ Windows complique l'écriture d'un script entacher de sécurité sur Windows si vous comptez sur l'un des builtins 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

En fait, 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 les droits d'écriture sur le script.

Autres conseils

mode Souillure est compliquée. Vous devez vraiment lire et comprendre perldoc perlsec . Votre problème est abordé dans la première phrase du Nettoyage de votre chemin .

scroll top