Einstellen der Apache2-Umgebungsvariablen PATH

13

Wie können Sie die PATHUmgebungsvariable für Apache2 festlegen ? Ich habe versucht, es in /usr/sbin/envvarsund in httpd.conf mit zu setzen SetEnv PATH(und es mit PassEnv an SSI weiterzugeben), aber es wird einfach nicht mitgerissen.

Matteo
quelle
1
Wünschen Sie weitere Informationen. Dies hängt vom jeweiligen Betriebssystem ab. Windows verhält sich anders als Un * xes. FreeBSD, RedHat und Ubuntu behandeln dies in verschiedenen Dateien.
Stefan Lasiewski
Sie sagen, einige Ansätze "funktionieren nicht für PATH". Sie müssen uns zeigen, wie Sie es testen.

Antworten:

15

Wie bereits erwähnt, verwenden Sie dazu eine Umgebungsvariablendatei. Ich werde in dieser Antwort weitere Details angeben und den Beweis erbringen, dass es funktioniert.

Diese Umgebungsvariablendatei muss aus einer Quelle stammen apachectl. Auf meiner Ubuntu-Box befindet sich diese Datei unter /etc/apache2/envvars. Auf RedHat ist dies um /etc/sysconfig/httpd. Auf FreeBSD ist dies eingestellt /etc/rc.conf(glaube ich). Alternativ können Sie diese Informationen auch in einem Startskript ( /etc/init.d/httpdoder apachectlusw.) festlegen . Ich halte es jedoch für das Beste, die Startskripte nach Möglichkeit in Ruhe zu lassen. Der beste Platz ist das angegebene Umgebungsvariablenskript.

  1. Überprüfen Sie den Speicherort dieser Envvars-Datei. /etc/init.d/apache2ctlZeigt unter Ubuntu, dass es folgende Quellen enthält /etc/apache2/envvars:

    # the path to the environment variable file
    test -z "$APACHE_ENVVARS" && APACHE_ENVVARS='/etc/apache2/envvars'
    # pick up any necessary environment variables
    if test -f $APACHE_ENVVARS; then
       . $APACHE_ENVVARS
    fi
    
  2. Zum Anzeigen der Variablen verwende ich ein Perl-Skript printenv.cgi und stelle es unter http://example.org/cgi-bin/printenv.cgi zur Verfügung . Das Skript zeigt mir den folgenden Pfad:

    PATH = /usr/local/bin:/usr/bin:/bin
    
  3. Um diese Variablen zu ändern, bearbeite ich die envvars-Datei:

    $ sudo vim /etc/apache2/envvars 
    
  4. Ändern Sie Ihren Pfad in dieser Datei. In diesem Beispiel werde ich /opt/local/binan meinen PATH anhängen . In einigen Fällen müssen Sie möglicherweise export PATHnicht nur Folgendes verwenden PATH:

    export PATH=$PATH:/opt/local/bin
    
  5. Starten Sie Apache neu

    $ sudo service apache2 restart
     * Restarting web server apache2
     ... waiting    ...done.
    $
    
  6. Sehen Sie sich die Ergebnisse auf http://example.org/cgi-bin/printenv.cgi an , die nun zeigen, dass der PATH jetzt ein neues Element enthält:

    PATH = /usr/local/bin:/usr/bin:/bin:/opt/local/bin
    

Wenn dies nicht funktioniert, kann etwas Ungewöhnliches passieren. Möglicherweise ignoriert oder überschreibt Ihr Skript den PATH.

Stefan Lasiewski
quelle
Stellen Sie sicher, dass Sie httpd neu starten. Ich habe versucht graceful, httpd zu verwenden. Dadurch wurden die Änderungen nicht wirksam.
Boykott SE für Monica Cellio
Auf Fedora 23: «Diese Datei wird nicht mehr zum Konfigurieren zusätzlicher Umgebungsvariablen für den httpd-Prozess verwendet. Es wurde durch systemd ersetzt. » Paste.debian.net/361218
Nemo
1

Auf meinem System ist es /etc/apache2/envvars.

Bis auf weiteres angehalten.
quelle
Es funktioniert aber nicht fürPATH
Matteo
@ Matteo: Das wird funktionieren. Siehe mein detailliertes Beispiel unten als Beweis.
Stefan Lasiewski
1

Stellen Sie sicher, dass Sie mod_env geladen haben.

Die korrekte Syntax lautet (Beispiel):

SetEnv LD_LIBRARY_PATH /usr/local/lib

Das hat bei mir funktioniert.

weh
quelle
Es funktioniert aber nicht fürPATH
Matteo
Wie lädst du mod_env? Wird es nicht standardmäßig geladen, da es integriert und statisch kompiliert ist?
Chase T.
1

Sie können es in der start()Funktion des Init-Skripts wie folgt einstellen :

start() {
        echo -n $"Starting $prog: "
        check13 || exit 1
        export PATH=${PATH}:/var/ossec/bin
        LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}

Erstellen Sie ein Perl-Skript, um alle Umgebungsvariablen aufzulisten:

#!/usr/bin/perl -wT
print "Content-type: text/html\n\n";

foreach $key (sort keys(%ENV)) {
  print "$key = $ENV{$key}<p>";
}

Legen Sie es in /var/www/cgi-binund überprüfen http://domain.com/cgi-bin/env.cgiSie , ob Sie die folgenden Punkte sehen:

PATH = /sbin:/usr/sbin:/bin:/usr/bin:/var/ossec/bin
Quanten
quelle
1

Unter RedHat mit Apache 2.4.x befindet sich die aus dem Quellcode kompilierte --prefix=/usr --enable-layout=RedHatenvvars-Datei unter /usr/sbin/envvars. Ich kann bestätigen, dass die Einstellung des entsprechenden PFADS in dieser Datei dazu führt, dass Apache und PHP davon Kenntnis haben.

Ich habe den gleichen Ansatz wie Stefan Lasiewski gewählt, um das herauszufinden. Für Apache 2.4.12 befindet sich die /usr/sbin/envvarsDatei in Zeile 49 von /usr/sbin/apachectl.

dcarrith
quelle
In Fedora 23 wird stattdessen Folgendes /usr/sbin/apachectlerwähnt /etc/sysconfig/httpd: «Diese Datei wird nicht mehr zum Konfigurieren zusätzlicher Umgebungsvariablen für den httpd-Prozess verwendet. Es wurde durch systemd ersetzt. » Paste.debian.net/361218
Nemo
1

Bearbeiten Sie die Apache2-Plist-Datei mit einem beliebigen Editor (Beispiel mit vim):

$ sudo vim /System/Library/LaunchDaemons/org.apache.httpd.plist

Fügen Sie der plist-Datei Folgendes hinzu:

<key>EnvironmentVariables</key>
<dict>
  <key>PATH</key>
  <string>/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin</string>
</dict>

Wenn der EnvironmentVariablesSchlüssel bereits vorhanden ist, fügen Sie ihn einfach hinzu

<key>PATH</key>
<string>/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin</string>

zum <dict>

NB: Für Mac OS X 10.11 (EL Capitan) oder höher müssen Sie den Befehl csrutil disableim Terminal ausführen, nachdem Sie CMD + R neu gestartet und gedrückt haben. Anschließend können Sie diese Datei bearbeiten.

Starten Sie Apache2 neu

$ sudo /usr/sbin/apachectl stop
$ sudo /usr/sbin/apachectl start
Frazras
quelle
0

Auf meinem Apache2-System stellte ich fest, dass viele Besucher nur meine sorgfältig zusammengestellte Sammlung von Smileys / Emoticons plündern wollten (im Ernst!), Also entschied ich mich, einen zufällig generierten Symlink zu dem Verzeichnispfad zu verwenden, der als aufgenommen wird Apache2-Variable, und es war praktisch unmöglich, Links zu teilen.

Daher führte cron alle 30 Minuten ein Perl-Skript aus, das die .htaccess-Datei neu schrieb und ein SetEnv enthielt, wie Sie unten sehen können:

....
SetEnv SMILEYDIR "QyQGTZ8cgcK3zMVL0aNJ"

Oben auf meinen PHP-Seiten habe ich die Variable dann so gelesen, und später auf der Seite wurde diese Variable verwendet, um einen Pfad zum entsprechenden Smiley zu erstellen:

$SMILEYDIR = apache_getenv("SMILEYDIR");
....
....
echo '<img src="/'.$SMILEYDIR.'//SMILEY_yay!.gif" border="0" hspace="3">';

Funktioniert für mich und hoffe es hilft dir!

peterg22
quelle
Es funktioniert aber nicht fürPATH
Matteo