mit PHP Shell mit Sudo ausführen?
Hallo,
Ich habe auf meinem Webserver ein Script geschrieben mit dem ich per shell_exec() ein Python Script mit sudo rechten ausführe. (Ja, ich weiß, es gibt weitaus sauberere Möglichkeiten aber dies ist jetzt zu umständlich zu erklären)
shell_exec("sudo python /home/pi/my_script.py");
Jetzt ist leider das Problem, dass das Script nicht ausgeführt wird. Übers Internet habe ich herrausgefunden, dass der User www-data das Script ausführt und ich dem User also ersteinmal erlauben muss sudo benutzen zu dürfen.
Dies habe ich auch schon hier angepasst:
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
root ALL=(ALL:ALL) ALL
www-data ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL
Da ich der einzige bin der Zugriff auf den Server hat, ist das auch vollkommen ok (auch wenn das eine Sicherheitslücke ist...).
Leider verstehe ich nicht, warum das Script nicht funktioniert.
Ich würde mich über eine Antwort freuen ^^
3 Antworten
Ist es ein Fehler beim Übertragen oder fehlt da tatsächlich ein schließendes Anführungszeichen?
Ok, verstehe. Gibt es denn irgendeine Fehlermeldung beim Ausführen des Befehls? Ist es sicher, dass es an den Berechtigungen liegt?
Und wie genau übergibt shell_execute das Passwort des Benutzers www-data an sudo? (SPOILERALARM: Gar nicht.)
Dazu müsstest du die /etc/sudoers anpassen, um dem Benutzer www-data zu gestatten, python ohne Passworteingabe zu starten.
Wie geht das denn? Bzw. Was muss ich dafür in die Datei schreiben?
steht doch in meiner Antwort. Die Zeile muss in die /etc/sudoers
Dann probiers zunächst mal "von Hand":
sudo -u www-data sudo /usr/bin/python
-c 'importos;print(os.getuid()==0)'
Das fragt einmal nach dem Passwort des aktuell angemeldeten Benutzers (ausser wenn dieser bereits root ist) und führt Python als root aus (und gibt entweder "True" oder "False" aus, wobei letzteres nur unter sehr seltsamen Umständen passieren sollte), in dem Fall sollte alles gut sein, oder aber es Fragt nach dem Passwort für www-data, was nicht so gut wäre.
www-data ALL=(ALL:ALL) ALL
hat für ein Script wenig Sinn, denn es wird trotzden nach dem Passwort gefragt, doch niemand kann es eintippen.
www-data ALL=(ALL) NOPASSWD: ALL
damit sollte es klappen.
Warum du das aber mit root-Rechten ausführen musst, bleibt ein Rätsel .
www-data ALL=(ALL) NOPASSWD: ALL
klappt leider bei mir nicht, ich habe den Raspberry auch schon neu gestartet und egal was ich probiere, sobald ich da sudo reinschreibe, führt er nichts aus
Wenn dein Script etwas mit dem web zu tun hat, dann kann durchaus jemand testen, ob das mit ID 0 ausgeführt werden soll. Root mögen die nicht.
shell_exec("echo \"passwort\" | sudo python /home/pi/my_script.py");
so könnte man das passwort 'eintippen' ;-)
lass doch einfach "echo <passwort>" weg, wenn für den User in der /etc/sudoers NOPASSWD steht, dann wird auch nicht gefragt.
kannst als User www-data auch mal
sudo python /home/pi/my_script.py
außerhalb eines Scripts starten
Da ist etwas dran - CAPs o.ä. zu nutzen wäre der weitaus sicherere Weg.
Hab ich nur in der Frage falsch geschrieben