Wie korrekt Parameter von php nach python?

  • 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

  • Ok, aber warum immer wieder der Hinweis das ich was falsch mache? Ohne konkrete Angabe wie es richtig ist? Habe bekannt gegeben das ich mit python wenig (fast keine) Erfahrung habe. Ist es denn so ein Verbrechen einem Neuling so zu helfen das es auch funktioniert? Und nochmal:

    das funktioniert von der Konsole!

    Aber nach wie vor nicht per php-Aufruf. Was muss denn nun endgültig mit visudo eingetragen werden? Entgegen unzähligen anderen Webseiten wo es so beschrieben ist wie ich es eigentlich mache?

    Inzwischen arbeite ich nun doch an einer komplett Python-freien Lösung. Was bleibt mir weiter übrig. Wenn es an einer solchen Kleinigkeit schon so massiv scheitert, wie soll denn dann eine größere, ggf. reine Python Version funktionieren? Und eine mehrseitige Homepage komplett auf Pyton umbauen welche reichlich html5, ccs Elemente beinhaltet, das wird wohl nix für mich. . .

  • Wenn es an einer solchen Kleinigkeit schon so massiv scheitert, wie soll denn dann eine größere, ggf. reine Python Version funktionieren? Und eine mehrseitige Homepage komplett auf Pyton umbauen welche reichlich html5, ccs Elemente beinhaltet, das wird wohl nix für mich. . .

    Ich glaube da hast du was nicht verstanden. Der serverseitige Teil wird in Python gemacht. Nicht das Frontend, das bleibt natürlich HTML, CSS und JS.

  • Hallo,

    Zitat

    Wenn es an einer solchen Kleinigkeit schon so massiv scheitert, wie soll denn dann eine größere, ggf. reine Python Version funktionieren?

    Das ist keine "Kleinigkeit". Es gibt Programmiersprachen, die spielen gut zusammen und es gibt welche, die spielen nicht gut zusammen. PHP+Python ist halt keine gute Kombi.

    Des Weiteren liegt dein Problem ja nicht Python, sondern am gesamten. Wenn du alles in Python machen würdest, hättest du z.B. definitiv keine Probleme mit der Übergaben von Werten.

    Abgesehen davon ist Webentwicklung mit Python IMHO schneller, einfacher und flexibler als mit PHP. Wenn du natürlich eine reine PHP Lösung hin bekommst - auch gut.

    Gruß, noisefloor

  • 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

  • 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?

    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. Und das mit meiner momentanen visudo Konfiguration.

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

    Gruß Justuv

  • hallo Justav, ich habe dir das am Montag schon mitgeteilt, wie du das machen kannst. Hier noch mal den Code und das Ergebenis:

    Code
    pi@raspberrypi:~ $ php parameter.php
    14.5;26.8%
    14.5
    26.8
    pi@raspberrypi:~ $ 

    Den Pfad hinter "command" musst du natürlich anpassen.

    Ja und die Parameter auch. Wäre es ein DHT 11 an GPIO 4 würde das so aussehen.

    $command = escapeshellcmd('/home/pi/temp/Adafruit_Python_DHT/examples/AdafruitDHT.py 11 4');

    was kommt als Ausgabe, wenn du in der Konsole so die PHP abfragst?

    Ich habe eine Raspi Beere 3 und freue mich, dass sie läuft. Ich programmiere gern und freue mich wenn es auch funktioniert. Aber grundsätzlich hab ich keine Ahnung davon :conf:

    Bitte löscht nie dieses Forum! Hier steht alles drin was ich mir merken muss!

  • 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?

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

    Ich will keine Verwirrung bringen, aber das Thema lautet nun mal so.

    meigrafd

    Ich lese damit, gesteuert über die crontab, alle 3 Minuten die Werte aus und speichere sie in einer Datei.

    Nix mit www-data als Benutzer.


    @Justuv

    Ich kann gerade nicht sehen, was bei dir in welcher Zeile steht. Aber mit den 3 Zeilen solltest du eine Ausgabe bekommen, wo der Wert für die Temperatur und Luftfeuchte zB. 14.5;26.8% steht, wenn Python im Hintergrund arbeitet.

    PHP
    <?php
    $command = escapeshellcmd('/home/pi/temp/Adafruit_Python_DHT/examples/AdafruitDHT.py 22 22');
    $output = shell_exec($command);
    echo $output ;
    ?>

    Wenn du im Verzeichnis bist, wo deine AdafruitDHT.py liegt, kannst du die Werte mit ./AdafruitDHT.py 22 22auch auslesen?

    Ich habe eine Raspi Beere 3 und freue mich, dass sie läuft. Ich programmiere gern und freue mich wenn es auch funktioniert. Aber grundsätzlich hab ich keine Ahnung davon :conf:

    Bitte löscht nie dieses Forum! Hier steht alles drin was ich mir merken muss!

  • Nix mit www-data als Benutzer.

    Hier geht es aber darum dass Justuv eine Datei über einen Webserver anspricht - da helfen deine "über Konsole ausführen" Ratschläge nichts.

    Sein Problem liegt an dem Missverständnis wie der visudo Eintrag aussehen muss.


    PS: Hat er überhaupt einen DHT22 Sensor? Er will nur GPIO's schalten, von DHT22 erwähnte er bisher nichts.

  • Sein Problem liegt an dem Missverständnis wie der visudo Eintrag aussehen muss.

    Und werd es wohl auch nicht mehr begreifen ;(

    Und danke allen welche helfen wollten, lasse es aber nun endgültig bei meinen 9 einzelnen Python-Scripten welche ich problemlos per php aufrufen kann. Machen was sie sollen, eben für jeden GPIO eine extra Datei. Was soll's.

    Gruß Justuv

  • 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:

  • Die Alternative funktioniert eigenartigerweise nicht (obwohl Shebang existiert). Dafür aber obige Version. Und dabei sehe ich wo, wie ich mich verrannt habe. . .

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

    Gruß Justuv

  • 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:

  • PS: Hat er überhaupt einen DHT22 Sensor? Er will nur GPIO's schalten, von DHT22 erwähnte er bisher nichts.

    Leider hast du recht :stumm:

    Ich hab ein wenig am Thema vorbei geschrieben...

    Aber die Übergabe der Parameter funktioniert so bei mir, zur Abfrage des DHT22. Sollte also auch mit anderen "Pythons" klappen. Aber gut. ich halte mich jetzt zurück. Sorry:blush:

    Da bekomme ich wohl nix ab von den Gummibärchen?:-/

    Ich habe eine Raspi Beere 3 und freue mich, dass sie läuft. Ich programmiere gern und freue mich wenn es auch funktioniert. Aber grundsätzlich hab ich keine Ahnung davon :conf:

    Bitte löscht nie dieses Forum! Hier steht alles drin was ich mir merken muss!

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!