
Ich habe einen Webserver, der auch Internetradio abspielt. Als WWW-Datenbenutzer möchte ich einige Befehle ausführen, zum Beispiel habe ich dies in/etc/sudoersDatei:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer
Und über PHP kann ich die Lautstärke ohne Verwendung eines Kennworts ändern, indem ich:
exec('sudo -u user amixer set Master 3%-');
Und:
exec('sudo -u user amixer set Master 3%+');
Aber jetzt möchte ich meinen eigenen Dienst neu starten können, indem ich den folgenden Befehl ausführe:
exec('sudo -u user service servicename restart');
Also habe ich versucht:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /bin/service
Und das:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer, /bin/service
Und sogar das:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer
www-data ALL=(ALL) NOPASSWD: /bin/service
Aber nichts davon scheint zu funktionieren. Bitte helfen Sie mir.
Sorry Leute - mein Fehler. Ich habe einige Änderungen vorgenommen, versucht, von /sbin nach /bin zu verlinken
Jetzt habe ich es geändert in:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /usr/sbin/service
Und es funktioniert! Danke! Thema geschlossen.
Antwort1
Seien Sie vorsichtig mit Ihrer Lösung: Sie können auf diese Weise jeden Dienst starten, stoppen oder neu starten!
Erstellen Sie besser ein Shell-Skript, das diesen Befehl ausführt:
echo "#!/bin/sh' > /usr/bin/amixer_restart
echo "sudo -u user service amixer restart' >> /usr/bin/amixer_restart
Gewähren Sie ausreichende Berechtigungen (550 bedeutet, dass Root und die Gruppe www-Daten lesen und ausführen können, niemand schreiben darf)
sudo chown root:www-data /usr/bin/amixer_restart
sudo chmod 550 /usr/bin/amixer_restart
Und erlauben Sie Apache, bei diesem Skript „sudo“ auszuführen:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer_restart
Antwort2
Das ist, was ich letztendlich gemacht habe:
- Installieren Sie Apache2 durch Ausführen
sudo apt-get install apache2
- Stellen Sie sicher, dass Apache CGI-Skripte ausführen darf, indem Sie
sudo a2enmod cgi
- Starten Sie Apache neu
sudo service apache2 restart
Überprüfen Sie, ob ich Bash-Skripte ausführen kann, indem Sie das folgende Skript erstellen unter
/usr/lib/cgi-bin/test.sh
#!/bin/bash # get today's date OUTPUT="$(date)" USR=$(whoami) # headers echo "Content-type: text/plain" echo "" # body echo "Today is $OUTPUT" echo "Current user is $USR"
Machen Sie das Skript ausführbar
chmod +x /usr/lib/cgi-bin/test.sh
Überprüfen Sie, ob ich das Skript ausführen kann.
curl localhost/cgi-bin/test.sh
Ich erhalte die folgende Antwort:Today is Wed Sep 6 12:19:34 PDT 2017 Current user is www-data
Da der Benutzer www-data ist, füge ich diesen Benutzer dann als sudoer hinzu. Anschließend ändere ich die Datei,
/etc/sudoers
indem ich am Ende diese Zeile hinzufüge:www-data ALL=(ALL) NOPASSWD: ALL
Nun sollte dieser Benutzer Root-Rechte haben. Dann ändere ich mein test.sh-Skript wie folgt:
#!/bin/bash # get today's date OUTPUT="$(date)" USR=$(sudo whoami)
Wenn Sie dann erneut eine Get-Anfrage ausführen, sollten Sie die folgende Antwort sehen
localhost/cgi-bin/test.sh
:Today is Wed Sep 6 12:28:38 PDT 2017 Current user is root