Jeod87: cgi ls ausführen im browser anzeigen lassen

Hallo zusammen,

ich mache nun schon eine Weile rum und habe schon mittelkleine Erfolge verbucht.

Ziel: (Mini Milestone bei einem umfangreichen Projekt) ich hätte gerne eine CGI datei die ich im browser aufrufen kann, welche auf dem Server (CentOS) ein Befehl (ls) ausführt und die Ausgabe dann dem Browser übergibt.

Ich habe ein *.cgi datei mit folgendem Inhalt:

#!/usr/local/bin/perl

exec ls;

wenn ich diese mit ./ls.cgi aufrufe klappt das gewünschte einwandfrei. wenn ich die datei allerdings über den browser aufrufe, krieg ich nur einen Internal Server Error.

Mein Apache kann CGI, daran liegt es nicht. ich wusste allerdings nur nicht mehr richtig wonach ich googlen soll ich denke ich brauch einfach nur noch irgendeinen befehl der die ausgabe abfragt und diese dann an den client weitergibt.

Danke schonmal

Gruß
Jeod

  1. Ich habe ein *.cgi datei mit folgendem Inhalt:
    #!/usr/local/bin/perl
    exec ls;

    wenn ich diese mit ./ls.cgi aufrufe klappt das gewünschte einwandfrei. wenn ich die datei allerdings über den browser aufrufe, krieg ich nur einen Internal Server Error.

    Bei dem Stand solltest du im error.log des Apachen etwas in der Art finden: "Premature end of script headers". Wenn du hiernach im Netz suchst und ggfls. um das Stichwort Perl ergänzt, solltest du der Lösung schon sehr nahe sein.

  2. #!/usr/local/bin/perl

    exec ls;

    wenn ich diese mit ./ls.cgi aufrufe klappt das gewünschte einwandfrei. wenn ich die datei allerdings über den browser aufrufe, krieg ich nur einen Internal Server Error.

    Du musst eine gültige http Antwort schicken. Wenigstens einen header in der Art:

    print "content-type:text\plain\n\n";

    Mein Apache kann CGI, daran liegt es nicht. ich wusste allerdings nur nicht mehr richtig wonach ich googlen soll

    z.b. nach der Fehlermeldung, du bist nicht der erste der diesen Irrtum begeht.

    Ich weiß auch nicht, ob exec wirklich der richtige Weg ist. Zumal es auch Perl Befehle und Module gibt, mit denen du ein Verzeichnis lesen kannst.

    Struppi.

    1. print "content-type:text\plain\n\n";

      super! damit hat es funktioniert vielen Dank!

      dass es da mit sicherheit schönere Möglichkeiten gibt ist mir bewusst, allerdings geht es prinzipiell mal darum wie man mit cgi systembefehle ausführt und den consolen output irgendwie wiedergeben kann :)

      neues Problem:

      versuche seit ner weile mein appache log file zu finden.

      angeblich unter logs/error_log

      log level: ist warning (default)

      finde das logfile aber net. locate sagt auch nichts dazu.

      1. dass es da mit sicherheit schönere Möglichkeiten gibt ist mir bewusst, allerdings geht es prinzipiell mal darum wie man mit cgi systembefehle ausführt und den consolen-output irgendwie wiedergeben kann :)

        Dafür bräuchtest du kein Perl, ein einfaches Shell-Skript reicht vollkommen:

        #/bin/sh
        echo "Content-Type: text\plain"
        echo
        ls

        (Eine HTTP-Antwort besteht aus einem Kopf- und gegebenenfalls einem Datenbereich. "Content-Type: text\plain" stellt den Kopfbereich, das zweite echo gibt die Leerzeile aus, mit der Kopf- und Datenbereich getrennt werden müssen. Im Anschluss folgen die Daten, hier von ls ausgegeben.)

        CGI besagt nur, dass der Webserver das gegebene Programm aufruft (hier: Perl-Skript, Shell-Skript), ihm einige Variablen übergibt (probiere in obigem Skript set statt ls) und dessen Ausgabe an den Browser weiterleitet. Nicht mehr, nicht weniger.

        versuche seit ner weile mein appache log file zu finden.

        angeblich unter logs/error_log

        a) Frage deinen Hoster.
        b) Schaue in der Apache-Konfiguration nach "ErrorLog".

        1. a) Frage deinen Hoster.
          b) Schaue in der Apache-Konfiguration nach "ErrorLog".

          zu a) ich bin mein eigener hoster^^
          zu b) da steht wie gesagt logs/error_log aber nichtmal locate findet sowas....

          1. b) Schaue in der Apache-Konfiguration nach "ErrorLog".
            zu b) da steht wie gesagt logs/error_log aber nichtmal locate findet sowas....

            Ist denn die DB aktuell(man locate)? Hast du mal per find gesucht?

            Ansonsten hier mal ein womöglich dich erhellender Hinweis:

            The ErrorLog directive sets the name of the file to which the server will log any errors it encounters. If the file-path is not absolute then it is assumed to be relative to the ServerRoot.

            Quelle, TFM: http://httpd.apache.org/docs/2.2/mod/core.html#errorlog

            1. Oh, da habe ich mich wohl letztes Mal vertippt.

              ich wollte zu a) sagen, dass ich mein eigener Hoster bin.

              ServerRoot nahm ich an dass das der ServerRoot vom Apachen ist, dies ist bei mir /var/www/html

              somit müsste die errorlog ja in /var/www/html/logs/error_log sein...

              in /var/www/html/ gibts allerdings keinen ordner mit dem namen logs. (da gibt es gar keinen ordner nur eine einzige datei (index.html))

              vor dem locate befehl habe ich sudo updatedb gemacht also sollte die DB ja aktuell sein...

              noch ne Idee?

              1. Hi,

                ServerRoot nahm ich an dass das der ServerRoot vom Apachen ist, dies ist bei mir /var/www/html

                Falsch angenommen.

                / wäre das Wurzelverzeichnis.

                MfG ChrisB

                --
                “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
              2. noch ne Idee?

                Einen fiesen und gleichsam wahren: Wenn du es als Admin nicht schaffst, die Position des error.log deines Apachen zu lokalisisieren: Beauftrage jemand, der fahig ist.

                1. noch ne Idee?

                  Einen fiesen und gleichsam wahren: Wenn du es als Admin nicht schaffst, die Position des error.log deines Apachen zu lokalisisieren: Beauftrage jemand, der fahig ist.

                  mhm klingt super... und dumm sterben... irgendwie muss man halt lernen... danke für die Hilfe!

                  1. noch ne Idee?

                    Einen fiesen und gleichsam wahren: Wenn du es als Admin nicht schaffst, die Position des error.log deines Apachen zu lokalisisieren: Beauftrage jemand, der fahig ist.

                    mhm klingt super... und dumm sterben... irgendwie muss man halt lernen... danke für die Hilfe!

                    habe es nun herausgefunden (falls das mal jemand ergoogelt hier:

                    es lag in /etc/logs/error_log

                    von locate wurde es da allerdings nie gefunden... warum weiß ich nicht!

                    1. Hallo,

                      habe es nun herausgefunden (falls das mal jemand ergoogelt hier:
                      es lag in /etc/logs/error_log

                      das ist nicht allzu verwunderlich, auch wenn die Konfiguration eher etwas sonderbar ist.

                      von locate wurde es da allerdings nie gefunden... warum weiß ich nicht!

                      und warum hast Du nicht, wie Dir geraten wurde, mit find gesucht?

                      Freundliche Grüße

                      Vinzenz

                      1. Ich muss mich nochmal korrigieren:

                        es liegt in /etc/httpd/logs/error_log

                        ich habe es nicht verwendet, da find nicht installiert ist und ich es absolut nicht kenne :(

                        "
                        $ find error_log
                        find: error_log: No such file or directory
                        "

                        1. ich habe es nicht verwendet, da find nicht installiert ist und ich es absolut nicht kenne :(

                          Natürlich ist es installiert.

                          $ find error_log
                          find: error_log: No such file or directory
                          "

                          Das habe ich auch versucht, aber offensichtlich ist die Syntax falsch, aber das sagt auch, dass find auf deinem system auf jeden Fall vorhanden ist.

                          Ich hab dann in einer Dokumentation gesucht unter Linux hilft man find (selbst auf wikipedia wärst du fündig geworden).

                          Wer hat dir den gesagt, dass die Datei error_log heißt? Das ist eine ungewöhnliche Bezeichnung. Sie heißt üblicherweise error.log

                          find /var/log -name "error.log"

                          Struppi.

                          1. ah ok danke... für mich war es ungewohnt dass locate etwas nicht findet (verstehe das immer noch nicht, da die DB ja aktuell sein muss)

                            Wer hat dir den gesagt, dass die Datei error_log heißt? Das ist eine ungewöhnliche Bezeichnung. Sie heißt üblicherweise error.log

                            Das stand in der config des Apachen so als Standard.

              3. Hallo,

                ServerRoot nahm ich an dass das der ServerRoot vom Apachen ist, dies ist bei mir /var/www/html

                nein, natürlich nicht. Aber das wurde Dir ja bereits gesagt.

                somit müsste die errorlog ja in /var/www/html/logs/error_log sein...

                und Du meinst, es wäre eine gute Idee, wenn Logs standardmäßig für jeden auf der Welt lesbar wären?

                War das zu schwer auf den Link ServerRoot zu klicken und dort nachzulesen?

                Freundliche Grüße

                Vinzenz