Schrift
[thread]12634[/thread]

User und Apache-Umgebungsvariablen in Perl?

Leser: 2


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Flashbaer
 2008-10-14 12:18
#115492 #115492
User since
2008-09-05
9 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen!

Ich habe eine Weboberfläche für ein paar Tools erstellt, hauptsächlich in PHP.
Dazu hab ich ein Upload-Skript in Perl geschrieben, da häufig Dateien mit mehreren GB größe hochgeladen werden.

Ich habe für die Oberfläche jetzt eine Umgebungsvariable vorgesehen, die die Document-Root der Seiten beinhaltet. Das habe ich deswegen gemacht, weil ich zum einen die Oberfläche momentan in einem Test-Verzeichnis habe und später irgendwo anders hin portieren muss, zum anderen weil ich verschiedene Programme am laufen habe die die Document-Root benötigen und ich in diesen nicht jedesmal diesen Pfad ändern will.

Die Umgebungsvariable wird beim anmelden eines jeden Users per Shell-Skript exportiert und ist also bei jedem User in jedem Programm verfügbar, also auch im Apache.
Das funktioniert bei PHP wunderbar, da werden alle Umgebungsvariablen eingebunden, nur wenn ich ein perl-Skript über den Apache aufrufe, sehe ich nichts außer die Variablen, die direkt vom Server kommen (Dateiname, IP-Adressen, Cookies etc.).
Wenn ich das Perl-Skript über die Konsole aufrufe, sind die Umgebungsvariablen alle da.

Perl wird - genau wie PHP - von Apache als Modul eingebunden, daher verstehe ich einfach nicht, warum die Umgebungsvariablen hier nicht zur Verfügung stehen.
Ich habe auch schon per Systemaufruf versucht, an die Variable heranzukommen, aber hier auch Fehlanzeige.

Was muss ich tun, um an die Variablen ran zu kommen? Ich bin am verzweifeln...

Viele Grüße
Flashbaer
pq
 2008-10-14 13:14
#115497 #115497
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
$ENV{DOCUMENT_ROOT} wird von apache immer bereitgestellt, da brauchst du dir keine
extra variable auszudenken.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Flashbaer
 2008-10-14 16:16
#115505 #115505
User since
2008-09-05
9 Artikel
BenutzerIn
[default_avatar]
Hi pq, danke für den hinweis, das war mir schon bekannt :)

Aber ich brauche eine externe Variable weil die $ENV{DOCUMENT_ROOT} in meinem Fall nicht der Document-Root von meiner Oberfläche entspricht und ich will eben eine Variable die das tut.
Beispiel: $ENV{DOCUMENT_ROOT} zeigt auf /htdocs/, meine Umgebungsvariable zeigt auf /htdocs/documents/.

Es kann nun eben sein dass sich meine Document-Root ändert und wenn ich dann in allen Skripten den Ordner "/documents/" fest einbinde dann muss ich alle Dateien hinterher wieder ändern und das will ich nicht.
Außerdem kann ich auch nicht andere Umgebungsvariablen wie "SCRIPT_FILENAME" etc. verwenden weil ich mit Symlinks arbeite die von verschiedenen Systemen aus auf die Datei verweisen.

Kurz und gut, ich muss letztendlich eine externe Umgebungsvariable irgendwie einbinden, das muss doch irgendwie möglich sein???
pq
 2008-10-14 16:51
#115506 #115506
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Flashbaer+2008-10-14 10:18:49--
Die Umgebungsvariable wird beim anmelden eines jeden Users per Shell-Skript exportiert

vielleicht wäre es an der zeit, mal etwas genauer zu erklären, was du machst. du nutzt anscheinend
mod_perl, soviel habe ich herausgelesen. über andere sachen hüllst du dich in schweigen.
was soll ein shell-script mit umgebungsvariablen machen? also wozu das shell-script?
und wie rufst du es auf und wann sollen wo dann in perl umgebungsvariablen gesetzt sein?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pq
 2008-10-14 16:59
#115507 #115507
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
oder mal ins blaue hineingeraten: setze in der httpd.conf
PerlPassEnv DEIN_VARIABLEN_NAME
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Flashbaer
 2008-10-14 19:33
#115520 #115520
User since
2008-09-05
9 Artikel
BenutzerIn
[default_avatar]
Hi pq, schon wieder Danke für deine Antwort :-)

Ich habs mit PerlPassEnv versucht, aber das hat irgendwie nicht funtktioniert.
Kann es sein dass es daran liegt, dass das Perl-Script evtl. über das CGI-Modul ausgeführt wird oder liege ich hier total falsch? Ich bin mir gerade nicht mehr sicher wie das bei mir konfiguriert ist...
Ich versuche es morgen mal mit PassEnv, vielleicht funktioniert das.


pq+2008-10-14 14:51:37--
vielleicht wäre es an der zeit, mal etwas genauer zu erklären, was du machst.

Also das ganze verhält sich so:
- es gibt eine Web-Oberfläche, von der aus verschiedene Programme aufgerufen werden
- es gibt PHP-Dateien, Perl-Dateien und shell-skripte, die alle ausgeführt werden sollen
- damit ich nicht in jeder datei den Pfad zu den verwendeten Programmen ändern muss wenn ich das ganze mal verschiebe habe ich eben eine Umgebungsvariable geschaffen ähnlich wie $PATH, damit alle verschiedenen Sprachen diese lesen können
- die Variable wird aus einem Shell-Skript exportiert, das beim login von jedem user aufgerufen wird, d.h. die Variable existiert auch in der Umgebung des Apache. Ist aber nicht so wichtig, wichtig ist nur dass die Variable im Apache vorhanden ist.
- in PHP kann ich drauf zugreifen mit $_ENV['VARIABLE'], in Shellskripten sowieso, nur mit Perl-Skripten nicht

ich hoffe mein Anliegen wird ein bisschen klarer...

Grüße
Flashbaer
pq
 2008-10-14 20:04
#115523 #115523
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
also mir ist es immer noch unklar. wann wird welches shellscript aufgerufen und exportiert
variablen, und wann werden die "PHP-Dateien, Perl-Dateien und shell-skripte" alle aufgerufen,
rufen PHP-skripte perl-skripte auf, shell-skripte perl-skripte, perl-skripte shell-skripte
oder wie oder was?
was hat das login eines users mit dem apache zu tun? du hast zwar jetzt viele sachen
aufgelistet, aber ich kann das alles nicht zusammenpuzzeln.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Flashbaer
 2008-10-15 11:32
#115536 #115536
User since
2008-09-05
9 Artikel
BenutzerIn
[default_avatar]
Hi,

also in Linux ist es so, dass man Variablen, die allgemein verfügbar sind, exportiert. Das sieht so aus:
VARIABLE='/pfad/nach/irgendwo'; export VARIABLE;
Das bewirkt, dass die Variable "VARIABLE" in die Umgebung des Benutzers, der das Skript aufruft aufgenommen wird. Damit ist die Variable so wie z.B. bei PHP oder Perl DOCUMENT_ROOT.

dann gibt es bei den meisten Linux-Systemen ein Verzeichnis "/etc/profiles.d/", in dem einige Shell-Skripte drin sind, die immer dann aufgerufen werden, wenn sich ein User einloggt. Da der Apache im Prinzip auch nur ein User ist, werden diese Skripte also auch aufgerufen wenn er gestartet wird (also sich quasi am System anmeldet).
Nun habe ich in dem oben genannten verzeichnis ein Shell-Skript, das eine Zeile wie die oben geschriebene beinhaltet und eine Variable exportiert. Die Variable wird somit für den Benutzer überall zugreifbar.

Die wohl bekannteste dieser Umgebungsvariablen ist PATH. In dieser wird gespeichert, welche Pfade benutzt werden sollen, um nach Programmen zu suchen (siehe http://www.linuxwiki.de/PATH).

Da diese Umgebungsvariable direkt an Perl weitergegeben wird, wenn über den Apache ein CGI-Skript aufgerufen wurd, dann muss es ja irgendwie möglich sein, auch andere Umgebungsvariablen weiterzugeben, die nicht standardmäßig weitergegeben werden, wie eben zum Beispiel selbst definierte Variablen.

Wie gesagt, in PHP kann ich frei auf die Variable zugreifen, da ist sie vorhanden.


Nun habe ich eine grafische Oberfläche geschrieben (ein paar PHP/HTML-Seiten), die das erleichterte Aufrufen von Programmen ermöglicht, so dass nicht immer die Konsole verwendet werden muss. Zu der Oberfläche gehören aber auch Shell-Skripte und einige Perl-Skripte (als CGI), da manches eben in Perl oder Shell besser realisierbar ist als in PHP. Manche Shell-Skripte und auch manche Perl-Skripte werden aber auch con PHP-Skripten aufgerufen - das ganze ist ein bisschen kompliziert aber es ist auch ein größeres Projekt.
Vielleicht kommen auch noch ein paar C-Programme hinzu, die ebenfalls als CGI laufen sollen.

Wenn ich jetzt also in all diesen verschiedenen Skripten eine Variable benötige, die auf den Ordner zeigt, in dem die Programme liegen, die ich aufrufen will, dann ist es doch nur logisch, eine Globale Umgebungsvariable zu benutzen, die von allen Programmen gelesen werden kann, sonst muss ich beim Verschieben des Programmordners alle Dateien ändern, bei C-Programmen sogar neu kompilieren etc.
Die Variable PATH möchte bzw. kann ich nicht verwenden, da ich Programme benutze, die gleich heißen wie Programme, die in den Pfaden von PATH vorhanden sind, und das würde zu Komplikationen führen.

So ich hoffe ich habe jetzt nichts offen gelassen :) Ansonsten einfach noch mal fragen!
murphy
 2008-10-15 12:44
#115541 #115541
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Flashbaer+2008-10-14 10:18:49--
[...]
Die Umgebungsvariable wird beim anmelden eines jeden Users per Shell-Skript exportiert und ist also bei jedem User in jedem Programm verfügbar, also auch im Apache.
Das funktioniert bei PHP wunderbar, da werden alle Umgebungsvariablen eingebunden, nur wenn ich ein perl-Skript über den Apache aufrufe, sehe ich nichts außer die Variablen, die direkt vom Server kommen (Dateiname, IP-Adressen, Cookies etc.).
Wenn ich das Perl-Skript über die Konsole aufrufe, sind die Umgebungsvariablen alle da.
[...]


Ich nehme an, dass der Apache, wenn er ein CGI aufruft, aus Sicherheitsgründen alle Umgebungsvariablen löscht, die nicht im CGI-Standard vorgesehen sind.

Vielleicht solltest Du statt eine Umgebungsvariable zu verwenden irgendwo eine Konfigurationsdatei anlegen, die Deine verschiedenen Programme auslesen können.
When C++ is your hammer, every problem looks like your thumb.
pq
 2008-10-15 12:50
#115542 #115542
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ich weiss, was umgebungsvariablen an sich sind. ich wollte von dir nur wissen, wann du
welches skript aufrufst.
es gibt auch leute, die machen den fehler, von perl aus shell-skripte aufzurufen und sich
nach dem beenden zu wundern, dass die darin gesetzten umgebungsvariablen nicht mehr da sind.

wie dem auch sei, mit PassEnv funktioniert es bei mir.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2008-10-14 12:18.