Datei wird nicht gefüllt
shadow
- cgi
Hi
Also mein Problem ist das ich mit hilfe der system() Anweisung eine Datei Aufrufen kann (eine Unix datei sh). So aber das komische an der Sache ist. Das die Datei die Ausgeführt wird die Datei erstellt nur das die Textdatei 0 kb ist. Und wenn ich unter Unix die Datei ausführe dann macht er eine Datei mit den Werten die drin sein sollen.
Muss ich irgendetwas beachten in Perl oder hab ich was flasch gemacht in Perl.
der Befehl sieht bei mir Monentan so aus:
system(/usr/home/ronny/www/cgi-bin/Aufruf.sh
);
Danke im vorraus
cu shadow
Halihallo shadow
Muss ich irgendetwas beachten in Perl oder hab ich was flasch gemacht in Perl.
Beides ja.
der Befehl sieht bei mir Monentan so aus:
system(/usr/home/ronny/www/cgi-bin/Aufruf.sh
);
Warum Backticks um Himmels willen?
perldoc perlop
<cite>
A string which is (possibly) interpolated and then executed as a
system command with /bin/sh or its equivalent. Shell wildcards,
pipes, and redirections will be honored. The collected standard
output of the command is returned; standard error is unaffected. In
scalar context, it comes back as a single (potentially multi-line)
string, or undef if the command failed. In list context, returns a
list of lines (however you've defined lines with $/ or
$INPUT_RECORD_SEPARATOR), or an empty list if the command failed.
</cite>
Der Backtick _führt_ das Shell-Script bereits aus und gibt _dessen_
Ausgabe zurück, welche du dann system() übergibst. Was du tust ist
a) das .sh-Script ausführen und
b) dessen _Ausgabe_(!) nochmals ausführen
Das kann nicht gut kommen! - Wobei ich mir noch nicht erklären kann,
warum die Datei auf 0 truncated (bzw. erstellt) wird. Aber ohne Code
ist das auch schwer nachzuvollziehen.
Viele Grüsse
Philipp
Also ich hab die Backtick ausgetauscht und Gänsefüße draus gemacht. Und selbst dann macht er eine Datei die 0 kb ist.
Ich würde ja das Script reinsetzten aber das wär dann sehr viel.
Ich kann aber dir mal zeigen welche datei ich ausführe. Also die sh Datei und die sieht so aus:
ksh PoolInDatei.sh > nwa_date +'%d\_%h\_%y - %H\_%M\_%S'
.txt
Das ist das was die Datei machen soll!! Und die Datei heißt Aufruf.sh
Und die will ich mit hilfe der system() Anweisung in mein Perl script ausführen. damit ich nicht in die Unix shell muss.
So und ich kann dir wenn du willst den Anfang rein setzten aber das bringt nich viel glaub ich da ich anfange die Datei auszulesen die erstellt wird lieder noch auf eine etwas unpraktische Art und weise.
Wenn ja musst sagen.
Danke an alle die mir helfen THX
Halihallo shadow
Also ich hab die Backtick ausgetauscht und Gänsefüße draus gemacht. Und selbst dann macht er eine Datei die 0 kb ist.
Das war auch zu erwarten, nichts desto trotz haben Backticks zwischen
einem system(...) nichts zu suchen (auch wenn es sinn macht, wäre es
eine potenzielle Sicherheitslücke).
Ich würde ja das Script reinsetzten aber das wär dann sehr viel.
Ich kann aber dir mal zeigen welche datei ich ausführe. Also die sh Datei und die sieht so aus:
Ich könnte mir gut vorstellen, dass es irgendwo an den Berechtigungen
happert... Unter welchem User läuft der Webserver, unter welchem
loggst du dich ein?
ksh PoolInDatei.sh > nwa_
date +'%d\_%h\_%y - %H\_%M\_%S'
.txt
Versuche dies mal in system() oder einem Backtick auszuführen, dann
die Fehler abzufangen und vorallem auch STDERR an dein STDOUT
umzuleiten (wenn dies deine Shell verträgt):
print ksh PoolInDatei.sh 2>&1
;
print "Error? => $! last pipe closed with ".($?>>8);
ohne die Umleitung in die Datei! - Dies sollte dir sowohl die
Standardausgabe und Standardfehlerhandel in deinem Script ausgeben.
Und die will ich mit hilfe der system() Anweisung in mein Perl script ausführen. damit ich nicht in die Unix shell muss.
Und wie startest du das Perl-Script? - Über CGI/Webserver?
Wenn ja musst sagen.
Versuch erst obengenanntes und beantworte die Fragen :-)
Viele Grüsse
Philipp
Also ich hab mein Account dort und dort hab ich schon nachgeschaut und meine Dateien sind so eingestellt das sie ausgeführt werden können also daran dürfte es nicht liegen.
Also ich kann dir grad nicht ganz folgen. Soll ich das
ksh PoolInDatei.sh 2>&1
;
print "Error? => $! last pipe closed with ".($?>>8);
in dei Aufruf.sh schreiben?
Bloss da lege ich doch dann keine Datei an. Denn grad das ist ja das worauf ich mein Perl Script Aufbaue.
Ja ich starte über CGI/Webserver
cu shadow
Halihallo shadow
Also ich hab mein Account dort und dort hab ich schon nachgeschaut und meine Dateien sind so eingestellt das sie ausgeführt werden können also daran dürfte es nicht liegen.
Hm...
Also ich kann dir grad nicht ganz folgen. Soll ich das
ksh PoolInDatei.sh 2>&1
;
print "Error? => $! last pipe closed with ".($?>>8);
in dei Aufruf.sh schreiben?
Nein, einfach in ein Testperl-Script, um zu schauen, welche Fehler
ausgegeben werden.
Bloss da lege ich doch dann keine Datei an. Denn grad das ist ja das worauf ich mein Perl Script Aufbaue.
"Step by step", der aber "divide and conquer".
Ja ich starte über CGI/Webserver
Das CWD (current working directory = Momentanes Arbeitsverzeichnis)
ist richtig gesetzt?
Stehen die Permissions für dieses Verzeichnis, der zu generierenden
Datei (falls schon vorhanden) und des Aufruf.sh und PoolInDatei.sh
entsprechend? - Sprich: auf read, write und execute für Gruppe (falls
Webserver unter derselben Gruppe läuft wie der User unterdem du in
die Shell einloggst) oder aber Everyone. Obwohl dies alles etwas
unsicher wird... Aber nötig, falls die Scripte auf Programme deines
Shell-Users zugreifen wollen.
Viele Grüsse
Philipp
Das ist das was er mir ausgibt wenn ich den Programm Code Starte.
ksh PoolInDatei.sh 2>&1
;
print "Error? => $! last pipe closed with ".($?>>8);
PoolInDatei.sh[3]: /root/mminfo: not found Error? => last pipe closed with 0
Also auf dem Webserver ist so weit alles eingestellt. Daran dürfte es eigentlich nicht liegen. Glaub ich
cu shadow
Halihallo shadow
ksh PoolInDatei.sh 2>&1
;
print "Error? => $! last pipe closed with ".($?>>8);
PoolInDatei.sh[3]: /root/mminfo: not found Error? => last pipe closed with 0
Und wo ist jetzt dein Problem? - /root/mminfo wird nicht gefunden,
da der User unterdem dein Webserver läuft keine Berechtigung auf das
/root Verzeichnis oder die Datei hat.
Also auf dem Webserver ist so weit alles eingestellt. Daran dürfte es eigentlich nicht liegen. Glaub ich
Aha, ich glaube aber doch. Oder wie erklärst du dir deine
Fehlermeldung?
Gleich vorweg: Es reicht nicht, dass du die Preferences von mminfo
entsprechend setzt, der User (Webserver) muss erstmal ins Verzeichnis
gelangen (dürfen) => execute+read auf everyone bei Verzeichnis,
execute+read auf everyone für mminfo. Aber eben: davon würde ich wirklich abraten, denn niemand ausser der root soll auf /root
zugreifen dürfen.
Viele Grüsse
Philipp
THX
Ich werd nachher mal mit dem Admin reden und dann muss er entscheiden wie es weitergehen soll.
Werde nächste Woche noch nen Topic machen da ich noch ein Prob hab. Aber damit werde ich aber erst am Montag anfangen.
Ich danke nochmal für dein Kompetente Hilfe und ich hoffe das du mir dort auch helfen kannst.
cu shadow