Apache2 führt keine Python Skripte aus

  • Hallo

    Habe ein kleines Problem und könnte eure Hilfe gebrauchen. Habe schon seit Tagen das IE durchsucht, aber alle Lösungsvorschläge funktionieren nicht.

    Istzustand:

    Habe einen Raspberry 2 der mein Teich im Garten steuert noch mit Jessy und Apache und PHP, den ich nicht mehr aktualisieren mag, da ich beführte das dann nichts mehr geht. Möchte jetzt aber

    erweitern. Deswegen habe ich einen Raspberry 3 mit aktuellen NOOBS, Apache2 und PHP7, Wenn der neue fertig ist soll der gegen den alten Raspberry ausgetauscht werden.


    Sollzustand

    Zur Zeit ist das aktuelle NOOBS mit Apache2 und PHP7 installiert. Soweit läuft auch alles.

    Meine Webseiten liegen im Verzeichnis /var/www/html

    Meine Python Skripte die die Relais steuern liegen im Verzeichnis /var/www/html/cgi-bin

    Auf meiner Webseite habe ich verschiedene Button womit ich die einzelne Relais steuern kann.

    Die Relais werden über ein Python Skript aufgerufen --> <a href='cgi-bin/relais1ein.py'><button>Einschalten</button></a>

    Wie gesagt das ganze läuft zur Zeit Fehlerfrei.


    Nur mit den neuen Raspberry bekomme ich es nicht hin, der Browser will mir die Datei runterladen und nicht ausführen.

    Habe mittlerweile alles was ich im IE finden konnte ausprobiert, da der Apache ja erst gesagt werden muss, das er die Python Skripte nicht runterladen sondern ausführen soll.


    Leider passen die Änderungen die ich gefunden habe nicht zu dieser Version. Entweder gibt es die Dateien nicht mehr, oder die Einträge passen nicht usw.

    Kann mir jemand sagen, was ich machen muss, damit der Apache das macht was ich gerne möchte!

    Es wäre mir sehr hilfreich, wenn ich weiß wo ich was machen muss, denn ich zähle noch zu den Anfängern von Linux. Bin deswegen noch nicht so bewandert darin.


    Für eure Mühe möchte ich mich schon recht herzlich bedanken.

  • Wenn der Pi kein Multi User Betriebsystem hätte, wäre die User- und Gruppenverwaltung halb so schwer.


    Der Webserver, von /var/www abwärts gehört dem User www-data, der Gruppe www-data und sollte grundsätzlich so eingestellt bleiben.

    Da Du schon alles, was Du finden konntest, ausprobiert hast, hast Du die User- und Gruppenrechte der /var/www Dateien und Verzeichnisse schon so verstellt und verdreht, dass sie kaum noch nutzbar sind.


    Wenn Du als User pi ein funktionierendes PHP Script erstellst und das Script ohne die --preserve Optionen kopierst, oder verschiebst, nimmt es die Rechte des Kopierenden an. Schlimmstenfalls hat www-data dann nur mehr Leserechte, oder gar keine Rechte. Im ersteren Fall wird nur mehr der Text des Scripts angezeigt.


    Servus !

    RTFM = Read The Factory Manual, oder so

    Edited once, last by RTFM ().

  • @RTFM

    Werde das entsprechend ändern, denn nach der Installation von Apache und PhP habe ich festgestellt, das es alles root Rechte sind. Das man die Rechte nicht so lassen soll weiß ich auch. Aber mein Gedanke war, erstmal so lassen und zum laufen zu bringen. Da nach meiner Meinung root Rechte alles erlauben und ich somit Berechtigungsprobleme so aussließen kann.


    @IIlutz

    Danke erst einmal für den Link, soweit hatte ich es auch schon probiert.

    "sudo a2enmod cgi" hatte ich auch schon ausprobiert.

    Danach wird ja beschrieben, das man diese Änderung machen sollte.


    <Directory /srv/www/yoursite/public_html>

    Options +ExecCGI

    AddHandler cgi-script .py

    </Directory>

    das ist jetzt mein Hauptproblem. Denn im IE werden unterschiedliche Dateien angegeben wo man den <Directory ..... </Directory> Eintrag stehen soll um den anzupassen.

    Ich habe schon etliche Dateien durchsucht, die ungefähren Namen haben wie im IE angegeben wird, aber nirgends finde ich die Stelle wo ich den Eintrag entsprechend ergänzen soll.

    Auch in den Link, den mir RTFM gepostet hat soll die Ergänzung eingetragen werden, aber wo??

  • das ist jetzt mein Hauptproblem. Denn im IE werden unterschiedliche Dateien angegeben wo man den <Directory ..... </Directory> Eintrag stehen soll um den anzupassen.

    Am einfachsten im <VirtualHost>-Block deines vhosts oder global in der apache2.conf.

    Folgendes funktioniert unter Stretch problemlos.

    Python-Script liegt in /echterPfad/cgi-bin/ und ist ausführbar.

    Beispiel vhost.conf

    Menschen die keine Ironie verstehen finde ich super!

    Edited 3 times, last by llutz ().

  • /relais1ein.py'

    Du bist ja nicht der Erste, der als User pi ein Python Script mit GPIO Ausgabe erstellt, das dann plötzlich an anderer Stelle (meist /var/www/...) nicht mehr funktioniert.


    Mir chmod und chown, mv + cp (ohne Option) änderst Du nur die Rechte und den Eigentümer am File, nicht aber den Inhalt.


    Wenn Dein Python Script - vom User pi aufgerufen - den Zustand eines GPIO Pins ändern kann, dann kann er es deshalb, weil er auf das Device /dev/gpio/... schreiben darf. Dies aber (auch nur) deshalb, weil er Mitglied der Gruppe gpio ist. Laur < ls -al /dev > hat neben root immer nur die dort ersichtliche Gruppe allerhöchstens Schreibrechte auf die einzelnen Geräte (Devices).


    Wenn der User pi ein Scrip aufruft werden auch seine Umgebungsvariablen (Enviroment) an das Programm und seine Unterprogramme vererbt; d.h. der USER=pi bleibt immer der User pi [und der User www-data bleibt immer www-data].


    Der einfachst Weg wäre, den User www-data in alle Gruppen aufzunemen, deren Geräte im Schreibzugriff benötigt werden (könnten). Ist aber nicht empfehlesnwert, weil der anmeldelose User www-data dann auch alle seine Gruppendevices nicht nur beschreiben, sondern auch löschen kann.


    Der Weg mit dem chmod "run as user" Bit Jedermann zu gestatten, ein Programm mit den Rechten des Eigentümers auszuführen, ist aus gutem Grunde inzwischen bei Scripten nicht mehr möglich.


    Dafür gibt es inzwischen die Möglichkeit, dass der Eigentümer einer Datei (hier der User pi an /relais1ein.py) einem anderen User (hier www-data) gestattet, als Eigentümer die Datei zu verwenden/auszuführen. < man setfacl > und die dortigen SEE ALSOs.



    Servus !

    RTFM = Read The Factory Manual, oder so

    Edited once, last by RTFM ().

  • Hallo,


    Python Skripte via CGI macht man seit 10? 15? Jahren eigentlich nicht mehr, weil das nur Nachteile hat.


    Standard ist WSGI, unter Apache in Kombination mit mod_wsgi. Besser & einfacher ist aber, Python Skripte über eine WSGI-Applikationsserver wie gunicorn ausführen zu lassen und Apache (oder nginx) als Reverse Proxy davor zu setzen.


    Aber mal grundsätzlich: erzeugen deine Skripte eine Ausgabe? Oder steuern die "nur" die GPIO Pins? Dann brauchst du doch weder CGI noch WSGI, sondern muss die Skript über die entsprechende Funktion von PHP ausführen.

    Oder du baust dir mit einem Webframework wie Flask eine einfache REST-API für die Steuerung.

    Oder du wirst PHP ganz weg und machst alles in Python :)


    Gruß, noisefloor

  • hyle

    die Abkürzung steht nur für "Internet"


    noisefloor

    mein Problem ist, das ich von Linux ein absoluter Anfänger bin, das heißt ich habe mir die Sachen aus den Internet geholt und ein bisschen umgeschrieben so das es bei mir läuft.

    Auch die Erweiterungen die ich vorhabe, Beleuchtung nach Sonnenuntergang zu steuern habe ich auch so gemacht. Das läuft bei mir ohne Probleme.

    Und was ich jetzt an Probleme habe ist, das ich eine Webseite in php habe mit Button wo ich verschiedenen Beleuchtung usw. damit ein- und ausschalten kann. Der Python Skript macht nichts anderes als ein GPIO Port zu schalten.

    Wenn es eine andere Lösung gibt als was ich jetzt habe, könntest du mir entsprechend einen Hinweis geben wonach ich suchen kann, oder mir ein Beispiel geben wie es auszusehen hat. Das würde mir dann weiterhelfen.

  • Hallo,

    Quote

    das heißt ich habe mir die Sachen aus den Internet geholt

    Doof ist halt, dass im Internet viel Schrott steht, gerne auch in Bezug auf Raspi + Python.

    Nichts desto trotz ist es schon abenteuerlich, dass du bei CGI gelandet bist. Wie gesagt, dass ist sowas von tot.

    Quote


    Der Python Skript macht nichts anderes als ein GPIO Port zu schalten.

    Dann ist CGI so wie so überflüssig. CGI bräuchtest du dann, wenn der Webserver ein Python-Skript ausführt, was Content z.B. in Form einer Webseite zurückliefert.


    Wie man ein Python Skript zum Schalten von GPIOs ausführt, findest du hier im Forum. Dazu gibt es Gefühlt eine Millionen Threads.

    PHP kennt einen Befehl zum ausführen von externen Skripten / Befehlen. Kann dir aber gerade nicht sagen, wie der heißt, weil ich kein PHP benutze.


    Gruß, noisefloor