shadow: Datei wird nicht gefüllt

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

  1. 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

    1. 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

      1. 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

        1. 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

          print 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

          1. 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

            print 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

            1. Das ist das was er mir ausgibt wenn ich den Programm Code Starte.

              print 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

              1. Halihallo shadow

                print 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

                1. 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