Beiträge von meigrafd

    Das klingt unlogisch... Bist du absolut sicher dass wirklich nur diese eine Zeile als Fehlermeldung auftaucht? Bitte alles posten

    Hast du alles in einer Scriptdatei untergebracht, oder läuft das Script fürs Display separat?

    Die Alternative funktioniert eigenartigerweise nicht (obwohl Shebang existiert).

    Damit das funktioniert müsste in der aller ersten Zeile der Scriptdatei zum Beispiel sowas stehen: #!/usr/bin/python...da gibts mehrere Möglichkeiten, wichtig ist der Anfang #! und dann der vollständige/absolute Pfad zum Interpreter, oder eines Programms wie env um den Interpreter zu ermitteln.

    Desweiteren muss die Datei Ausführrechte besitzen: chmod +x /usr/local/bin/schripte/aktion.py

    Erst dann würde es funktionieren die Datei direkt anzusprechen.

    Vorher manuell testen und das Script via Konsole direkt ausführen (ohne Übergabe an einen Interpreter!): /usr/local/bin/schripte/aktion.py

    ..wenn das nicht funktioniert, auf die Fehlermeldung achten - ansonsten könnte crontab/apache/php/whatever auch nicht zaubern.

    Die zweite Version übergibt die Datei direkt an den Interpreter, dann wird ein möglicher Shebang usw ignoriert.

    Eine Frage noch: Wohin mit dem LKW Gummibärchen?

    :-/ Nu bin ich verwirrt :daumendreh2:

    Du änderst einfach

    www-data ALL(ALL) NOPASSWD:/usr/local/bin/schripte/aktion.py

    in

    www-data ALL(ALL) NOPASSWD:/usr/bin/python

    und kannst dann ganz normal

    exec("sudo /usr/bin/python /usr/local/bin/scripte/aktion.py 12 1");

    verwenden.


    Alternativ setzt du in der Scriptdatei /usr/local/bin/scripte/aktion.py einen Shebang, machst die Datei ausführbar (+x) und nutzt dann:

    www-data ALL(ALL) NOPASSWD:/usr/local/bin/schripte/aktion.py

    exec("sudo /usr/local/bin/scripte/aktion.py");


    :dau2:

    Guido64 Es bringt keine Besserung wenn er die PHP Datei über die Konsole ausführen würde. Das so zu erwähnen schürt nur weiter Verwirrung.

    Der Webserver läuft über den Benutzer www-data. Spricht man über den Webserver eine PHP Datei an wird diese Serverseitig ausgeführt und verarbeitet, über den Benutzer www-data. Es müssten also wenn dann die Zugriffsrechte und Befugnisse des www-data Benutzers überprüft werden.

    Jeder der mit dem Pi arbeitet ist in 90% der Fälle als Benutzer pi angemeldet, manche wechseln auch zum Benutzer root. Also kann man durch eine einfache Ausführung über die Konsole nicht das Verhalten des www-data Benutzers nachbilden / überprüfen.

    Eigentlich nichts weiter als : "Wie, was mache ich denn nun?" Es nützt mir nichts wenn ich immer wieder lese: "Du mußt den Befehl eintragen" Im Netz finde ich dazu nichts, also soll ich folgenes machen?

    "www-data ALL=(ALL) NOPASSWD: /usr/bin/python"?

    Trotzdem würde ich gern wissen warum es ohne Parameterübergabe funktioniert denn:

    exec("sudo /usr/bin/python /usr/local/bin/scripte/aktion.py");

    macht ja was es soll.

    Natürlich findet man das im Netz - hast du ja auch schon gefunden. Der Punkt ist nur dass Du es fehlerhaft interpretiert hast:

    Die php-Datei liegt in /var/www/html/, die python Datei in /usr/local/bin/scripte/.

    Ausführbar gemacht mit "sudo chmod +x aktion.py".

    Mit "sudo visudo" dann unter "includedir /etc/sudoers.d" folgendes: "www-data ALL(ALL) NOPASSWD: /usr/local/bin/schripte/aktion.py" notiert.

    Dann ist das hier falsch?

    Code
    ### Defaultkonfiguration in /etc/sudoeres unter Raspbian
                    ...
                    # in /etc/sudoers
                    # erlaubt www-date die Ausführung eines Scripts
                    www-data ALL=(ALL) NOPASSWD: /etc/myscripts/do-whatever

    In das PHP-Script können Sie nun den folgenden Code einbauen:

    Code
    $output = shell_exec("sudo /etc/myscripts/do-whatever");
    echo "\n<pre>$output</pre>\n";

    Quelle: https://kofler.info/sudo-ohne-passwort/ Ansosten finde ich auch nichts anderes als lediglich 'das Script' einzutragen. . .

    Erkennst du wirklich nicht den Unterschied zu Deinem Vorgehen?

    Du führst über PHP das aus: exec("sudo /usr/bin/python /usr/local/bin/scripte/aktion.py");

    Was davon ist der Befehl der ausgeführt wird, und was davon ist die Scriptdatei?

    Dein visudo Eintrag sieht so aus: www-data ALL(ALL) NOPASSWD: /usr/local/bin/schripte/aktion.py

    Du führst den Befehl python aus, das erste Ding nach "sudo" in deiner Befehlszeile (exec).

    Dem Befehl übergibst du eine Datei zum verarbeiten - das ist ein Parameter, wie zum Beispiel ls ein Befehl ist und -la ein Parameter (bzw zwei). ps ist ein Befehl und aux ein Parameter. Usw..

    Mögliche Parameter (durch Leerzeichen getrennt) sind visudo völlig Egal.

    In dem von Deiner Anleitung aufgeführten Beispiel wird das ebenfalls beschrieben, die Befehlszeile ist shell_exec("sudo /etc/myscripts/do-whatever"); und der visudo Eintrag ist www-data ALL=(ALL) NOPASSWD: /etc/myscripts/do-whatever

    Bei /etc/myscripts/do-whatever handelt es sich in jedem Fall um eine ausführbare Datei (chmod +x), wo es sich, entweder um eine Scriptdatei mit Sheband, oder einer Binary handelt.

    Wenn du also keinen Shebang in /usr/local/bin/scripte/aktion.py eingetragen hast, was müsstest du dann in visudo als Befehl eintragen?

    Wenn du einen Shebang hast, was müsstest du dann in deiner Befehlszeile (exec) raus nehmen damit die Scriptdatei zum Befehl wird?

    Ich hab dir zuletzt auch einen weiteren Link genannt wo das ebenfalls ausführlich beschrieben wird - also die Ausrede, man finde darüber nichts im Netz, zählt nicht - oder sind wir hier nicht auch im Netz?

    Aber ok, wie schon geschrieben verzichte ich nun auf python und bleibe bei php mit WiringPi. Obwohl für den Mailversand etwas python doch noch bleiben muss. . .

    Urks :dau1:Broken By Design!

    Was verstehst du denn nicht an der Vorgehensweise über Python?

    Kann es vielleicht sein das du es ggf selber mehrfach ausführst oder sogar noch alte Instanzen aktiv sind?

    Als Benutzer root ist sudo überflüssig, da du doch bereits root bist was soll da sudo noch bewirken?


    PS: Du musst das Script mit python3 ausführen, nicht mit python. Kleiner aber feiner Unterschied! Letzteres wäre nämlich nur python2, der Shebang besagt aber?

    Und ja, Das Script aus Beitrag#137 wirft bei python3 dann einen Fehler, den es mit python2 nicht gibt. Das wiederum liegt an Deiner Abänderung des "brains".

    Ok, aber warum immer wieder der Hinweis das ich was falsch mache?

    Ist es denn so ein Verbrechen einem Neuling so zu helfen das es auch funktioniert?

    Ich hab dir gesagt was du falsch machst und inwiefern du deine Anleitung falsch verstanden hast. Zusätzlich sagte ich auch was du ändern musst damit es funktioniert. Was erwartest du noch?

    Nochmal:

    In visudo trägt man den Befehl ein. Du führst den Befehl python aus. Du hast in visudo aber nicht diesen Befehl eingetragen. Was musst du also ändern?

    Der vermutlich für Dich wichtigste Unterschied zwischen Python und PHP ist dass du kein visudo brauchst.

    Das zB. web_bottle.py Script kannst du direkt mit sudo als Benutzer pi ausführen. Ein Webserver wie apache2 läuft aber über einen anderen Benutzer "www-data" dem du erst explizit via visudo das Recht einrichten musst einen bestimmten Befehl ohne Passwordabfrage über sudo auszuführen - das entfällt via Python.

    Aufmerksam lesen:

    FAQ => Nützliche Links / Linksammlung => PHP: Anleitung zum schalten von GPIO (ja die Anleitung ist leider seid dem Umzug des Forums kaputt)

    Besser:

    FAQ => Nützliche Links / Linksammlung => [Python] Webserver, Websocket und ein bisschen AJAX

    Nein, Dein Eintrag ist falsch.

    Du führst den Befehl python aus - die Übergaben an diesen Befehl spielen keine Rolle. Was du in visudo eintragen musst ist der Befehl, der über sudo ausgeführt werden darf...

    Wenn du in der Scriptdatei einen Shebang setzt UND die Datei ausführbar machst, kannst du python weg lassen und direkt die Scriptdatei ausführen. Aber Du führst python aus

    Also ist es nur ein Platzhalter?

    Jein. Das vollständige Script sollte man dabei schon betrachten https://slexy.org/view/s2YuDqH3Zf

    Zeile 10 setzt die Variable auf einen leeren Zustand, damit ist sie zumindest vorhanden und abrufbar.

    Zeile 19 vergleicht den Inhalt der Variable mit einer anderen. Wenn zu diesem Zeitpunkt die Variable nicht definiert wäre gäbs einen Fehler und das Script crasht - nicht Sinn der Sache.

    Angenommen datumvorher ist leer, dann trifft die Abfrage in Zeile 19 nicht zu und somit wird der Abschnitt in "else" verarbeitet. Wenn die temperaturen Liste noch nichts enthält wird Zeile 23 - 29 ebenfalls noch nicht ausgeführt sondern nur der erste Eintrag in die Liste vorgenommen, sowie datumvorher befüllt. Beim nächsten Durchlauf (nächster Eintrag aus der csv Datei) ist datumvorher sowie temperaturen dann nicht mehr leer ...

    Nach nochmals Stunden Google-Recherche gibt es wohl keine Lösung welche(bei mir!) funktioniert.

    Wenn etwas nur bei dir nicht funktioniert, bei anderen aber schon, liegt das nicht am Code :baeh2:

    Der Code funktioniert bei mir problemlos. Daher wäre es jetzt an der Zeit dass du uns die vollständigen Schritte offen legst die Du zur Einrichtung vorgenommen hast - es reicht nämlich nicht nur die beiden Scripts einzurichten. (hoffentlich hast du meinen Link gelesen?)

    Wenn es dir tatsächlich nur darum geht stink normale GPIO's ein und auszuschalten kannst du das auch direkt über PHP machen, ohne den Umweg über Python: sysfs. Jeder Umweg ist eine zusätzliche mögliche Fehlerquelle die es zu vermeiden gilt.

    Telegram hat den Nachteil das es auf Handy# basiert bzw damit verknüpft wird... Zum einen möchte ich nicht unbedingt jedem meine Handy# geben (und auch nicht an meinen Kontakten etwas modifizieren), zum anderen ist das eine Bedingung die nicht jeder erfüllen kann und zu guter letzt starrt man auch so schon zu viel ständig aufs blöde Smartphone.

    Ich werfe daher mal Discord in den Raum *duck*