Perl-Module aus dem aktuellen Verzeichnis laden
In Perl ist es inzwischen nicht mehr ohne weiteres möglich, Module aus dem aktuellen Verzeichnis zu laden. Hier werden einige der Möglichkeiten aufgezeigt, das zu ändern.
Seit Perl 5.26 ist das aktuelle Verzeichnis nicht mehr im Suchpfad der nachzuladenden Module. Aufgrund einer 2016 entdeckten Sicherheitslücke haben viele Distributionen bereits eine entsprechende Änderung in den Standardeinstellungen vorgenommen, unabhängig von der eingesetzten Perl-Version.
Was generell gut für die Sicherheit ist, ist im Einzelfall ein Problem für Anwendungen, die sich darauf verlassen haben, ihre Module relativ zum aktuellen Arbeitsverzeichnis zu finden. Was kann man tun, um diese Anwendungen funktionsfähig zu halten? Man benötigt keine Speziallösungen, denn es gibt eine Reihe von Standardmethoden.
-
Die beste Möglichkeit ist sicher, das Programm zu ändern und den Ort oder die Orte, von denen Module gelesen werden sollen, zu übergeben oder zu konfigurieren. Dazu gibt es verschiedenste Möglichkeiten. Letztlich fügt man die konfigurierten Pfade der Perl-Variablen
@INC
hinzu. -
Etwas einfacher, aber nur bei genau geprüften Programmen zu empfehlen, ist es, das aktuelle Verzeichnis zu
@INC
hinzuzufügen:push(@INC, ".");
In realem Code würde man vorher noch prüfen, ob
.
bereits in@INC
enthalten ist, um es nicht ein zweites Mal hinzuzufügen. -
Wenn man den Code nicht ändern will, kann man entweder mit den Umgebungsvariablen
PERL5LIB
oderPERLLIB
(ersteres hat Vorrang) oder mit der Option-I
das aktuelle Verzeichnis oder spezifische Modulverzeichnisse hinzufügen. -
Unter Debian kann man momentan auch die Umgebungsvariable
PERL_USE_UNSAFE_INC
setzen, z.B. auf 1 oder einen anderen von 0 verschiedenen Wert. Dies ergibt sich daraus, dass Perl bei jedem Aufruf eine Datei sitecustomize.pl aufruft. Der genaue Pfad hängt von der Installation ab, liegt aber meist unter /etc. Bei Debian ist es die Datei /etc/perl/sitecustomize.pl, die im Wesentlichen nur eine Anweisung enthält:pop @INC if $INC[-1] eq '.' and !$ENV{PERL_USE_UNSAFE_INC};
Es sei darauf hingewiesen, dass die Umgebungsvariable
PERL_USE_UNSAFE_INC
nur mit Debian 9 funktioniert und wahrscheinlich schon in Debian 10 verschwunden sein wird.