Wenn man Sensoren mit dem Raspberry übr eine PHP-Seite abfragen will, kommt man immer wieder in Konflikt mit den Benutzerrechten. Der Benutzer www-data, unter dem der Apache läuft und die PHP Seite somit ausgeführt wird, hat nicht genügend Rechte um die Abfrage auszuführen.

Ich zeige euch in diesem Artikel, was angepasst werden muss, damit der Benutzer www-data Sensoren abfragen kann.

Problem

Bestimmte Befehle auf der Kommandozeile lassen sich nur mit root Rechten ausführen. Dafür exisitiert der befehl sudo, mit dem ein Benutzer Befehlen mit root Rechten ausfühen kann. So ein Befehl ist zum Beispiel hostname. Mit diesem Befehl kann man den Namen des Rechners ändern. Wenn Sie den Befehl in der Konsole ausführen, wird ihnen der Name des Raspberry Pi ausgegeben. In der Regel ist das der Name raspberry. Also probieren wir mal den Befehl in einer PHP-Seite auf den Raspberry Pi auszuführen um den Rechnernamen in test zu ändern.

Wenn wir nun diese Seite im Browser aufrufen, sollte die Ausgabe raspberry raspberry sein. Der Rechnername worde also nicht geändert. Mehr Aufschluß gibt die Log Datei /var/log/apache2/error.log. Dort stehen nun

hostname: you must be root to change the host name

Also das ganze mit sudo

Auch hierbei wird der Rechnername nicht geändert und es kommt folgede Meldung in der Log Datei

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

sudo: no tty present and no askpass program specified

Lösung

So klappt es also nicht. Das liegt daran, dass der Benutzer www-data nicht das Recht hat, Befehle unter sudo auszuführen. Um das zu ändern, müssten folgende Anpassungen vorgenommen werden.

  1. Der Benuter www-data muss in die Gruppe sudo aufgenommen werden
    sudo usermod -aG sudo www-data
  2. Der Gruppe sudo muss erlaubt werden einen root befehl ohne Passwort auszuführen
    Dafür muss die Zeile
    %sudo ALL=(ALL:ALL) ALL
    in der Datei /etc/sudoers folgendermaßen geändert werden
    %sudo ALL=(ALL:ALL) NOPASSWD:ALL

Danach sollte der Rasberry neu gestartet werden. Wenn man nun die PHP Datei erneut in Browser aufruft, sollte die Ausgabe raspberry test sein. Der Hostname wurde also erfolgreich geändert. Und es erscheinen auch keine Fehlermeldungen mehr in der Datei /var/log/apache2/error.log.

Zugegeben, der Befehl hostname ist nicht gerade ein Beispiel, dass der Realität entspricht. Aber er verdeutlicht die Probleme, die man bei der Ausführung von Konsolenbefehlen unter PHP hat. Es besteht genau das gleiche Problem, wenn Sie zum Beispiel einen Temperatursensor, wie im Artikel Temperatur messen mit dem Raspberry Pi beschrieben, mit PHP abfragen wollen.