Zur Navigation

Mit PHP Shell mit sudo ausführen funktioniert nicht

1 Tom12



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

29.08.2019 19:18

2 Jörg

Im Return von shell_exec() könnten vielleicht auch Fehlermeldungen enthalten sein:

echo shell_exec("/usr/bin/sudo /usr/bin/python /home/pi/my_script.py");

Ich würde die vollen Pfade angeben, da diese www-data möglicherweise unbekannt sind. Edit: und da fehlte noch ein " am Ende

Einträge in der /etc/sudoers lassen sich auch auf einzelne Befehle beschränken, so dass das Sicherheitsloch, welches man aufreißt, nicht ganz so groß ist .

Vermutlich scheitert die Ausführung auch an der fehlenden Passworteingabe durch www-data. Mit dem Tag NOPASSWD kann die Passwortabfrage deaktiviert werden:

www-data ALL = NOPASSWD: /usr/bin/python /home/pi/my_script.py


29.08.2019 19:50 | geändert: 29.08.2019 19:54

3 Tom12

www-data ALL = NOPASSWD: /usr/bin/python /home/pi/my_script.py

Hallo, woher weiß ich denn ob mein Script mit:
/usr/bin/python
/usr/bin/python2
/usr/bin/python2.7
/usr/bin/python3
/usr/bin/python3.7
/usr/bin/python3.7m
/usr/bin/python3m

ausgeführt wird?

07.09.2019 16:29

4 Jörg

Wenn du das Script normalerweise mit `python` ausführst, dann wird /usr/bin/python verwendet, da sich /usr/bin vermutlich in deinem Pfad befindet.

Unter Debian 10 ist /usr/bin/python ist ein Symlink auf /usr/bin/python2, welches wiederum auf /usr/bin/python2.7 verweist. Wenn man dort python3 verwenden möchte, muss man das Binary explizt als /usr/bin/python3 aufrufen.

Du kannst dir die Verlinkung auf deinem System mit `ls -l` anzeigen lassen:

ls -l /usr/bin/python*

07.09.2019 16:56 | geändert: 07.09.2019 16:56

5 Tom12

Hallo,
Leider klappt das ganze immer noch nicht. Der Befehl wird einfach nicht ausgeführt. Gibt es vielleicht eine Möglichkeit, dass der User generell sudo ausführen darf, also unabhängig davon ob er jetzt Python ausführt oä.?

Und dann noch eine Frage. Muss ich nach dem bearbeiten von "visudo" den Raspberry Pi neustarten oder reicht das einfache abspeichern auch aus (hab beides probiert, finde das neustarten zum ständigen testen nur etwas aufwändig)

Ich hoffe das klappt band. Ich sitzte da jetzt schon mehrere Wochen dran :/

Vielen Dank aber schoneinmal

15.09.2019 15:16

6 Jörg

Gibt es vielleicht eine Möglichkeit, dass der User generell sudo ausführen darf, also unabhängig davon ob er jetzt Python ausführt oä.?

www-data ALL=(ALL) NOPASSWD: ALL

Und dann noch eine Frage. Muss ich nach dem bearbeiten von "visudo" den Raspberry Pi neustarten oder reicht das einfache abspeichern auch aus

Ich denke, der Apache sollte neu gestartet werden, damit er dann mit den neuen Rechten agieren kann.

Es kann auch sein, dass das Python-Script selbst Umgebungsvariabeln enthält, die www-data unbekannt sind. Du kannst das Script auch testweise als User www-data in der Shell ausführen und schauen, ob es hierbei schon zu Problemen kommt:

sudo -u www-data /usr/bin/python /home/pi/my_script.py

16.09.2019 09:39

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]