Pourquoi ne pas une pipe travail ouvert sous le mode de Perl souiller?
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;
}
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 .