Frage

Meine ursprüngliche Skript ist wie folgt:

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

Diese Skripte funktioniert gut. Wenn ich an den Skript add folgende Zeile, nicht daran arbeiten:

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

Was ist Perl verwenden, wenn Rohr offen genannt wird?

Die Zugabe von folgendem Code das Problem behoben:

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

Lösung

Ihre Frage ist nicht wirklich besudeln Modus verwendet. Sie

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

Diese Verzeichnisse nicht existieren normalerweise auf einem Windows-Rechner. dir ist ein cmd.exe interner Befehl so in der Lage sein, dass auszuführen, müssen Sie das Verzeichnis hinzuzufügen, wo es auf den Pfad befindet.

Nun beachten Sie, dass die Art und Weise Sie gehen tun es den ganzen Punkt widerspricht dem Weg zu bekannten bestimmten Orten zu setzen. Es ist auf jeden Fall möglich, dass ein ruchloser Benutzer diese Umgebungsvariable zu ändern, um seine gefährliche Version von dir zu zeigen.

Die Tatsache, dass Windows nicht unbedingt in C: installiert. \ Windows verkompliziert einen Makel sicheren Skript unter Windows zu schreiben, wenn Sie auf einem der Shell builtins verlassen

EDIT: Hier ist ein kurzer Test Programm, das Sie als Basis verwenden können:

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

Im Grunde, was Sie brauchen, ist für den Systemadministrator des akzeptablen Pfad bei der Installation und für nicht vertrauenswürdige Benutzer codieren keine Schreibrechte auf dem Skript zu haben.

Andere Tipps

Taint-Modus ist kompliziert. Sie müssen wirklich lesen und verstehen perldoc perlsec . Ihr Problem wird im ersten Satz des Reinigen Sie Ihren Weg Abschnitt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top