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?
### 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:
$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 Broken By Design!
Was verstehst du denn nicht an der Vorgehensweise über Python?