peterha
Goto Top

Linux-Shell via PHP-Datei ausführen

Moin zusammen!

Ich gebe mich nach einigen Stunden nun geschlagen und bitte euch um eure Hilfe.

Ich habe meinen Raspberry mit einem Funkchip gepaart, sodass er Steckdosen an und ausschalten kann. Das Ganze funktioniert auch schon, wenn ich das Skript via Kommandozeile aufrufe.


Folgende Dateien gibt es:

Skript, das Steckdose 4 anschaltet:
/home/pi/wiringPi/raspberry-remote/41
Skript, das Steckdose 4 ausschaltet:
/home/pi/wiringPi/raspberry-remote/40

Ich habe einen Apache installiert und dort gibt es:

/var/www/41.php

/var/www/40.php

Das Ziel: Ich will über die URL http://raspberry/41.php die Steckdose anschalten können.

Was muss in der 41.php drin stehen, damit es das Skript /home/pi/wiringPi/raspberry-remote/41 ausführt?


Danke vorab für eure Hilfe und gute Nacht....

Peter

Content-ID: 268272

Url: https://administrator.de/contentid/268272

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

116830
116830 03.04.2015 aktualisiert um 08:36:42 Uhr
Goto Top
Sofern du dich in der bash-Datei um die benötigten root-Rechte gekümmert hast, reicht ganz einfach der folgende Inhalt:

<?php
shell_exec('/home/pi/wiringPi/raspberry-remote/41 ');  
?>

Sofern sich nicht um die root-Rechte gekümmert wurde, ist es nötig dem Nutzer (www-data), der den Apache2 Webserver ausführt, zum Ausführen dieses Skripts volle Rechte zu geben. Dazu kann der Befehl, nach der Vergabe der Rechte, mittels sudo aufgerufen werden.

<?php
shell_exec('/home/pi/wiringPi/raspberry-remote/41 ');  
?>

Weiterführende Links:
-> http://www.elektronx.de/tutorials/gpio-per-web-ansteuern/
-> http://kampis-elektroecke.de/?page_id=1659
-> http://php.net/manual/de/function.shell-exec.php
-> http://forum.ubuntuusers.de/topic/geloest-shellscripte-mit-php-als-root ...

Diese zusätzlichen Rechte sind nötig, da du Ausgänge auf Hardware-Ebene nutzt um den Funksender anzusteuern.
peterha
peterha 03.04.2015 aktualisiert um 11:21:55 Uhr
Goto Top
Moin, danke für die Antwort.

Ich habe das Skript mit chmod +x ausführbar gemacht.
Wenn ich das Skript in der Kommandozeile aufrufe geht es:
pi@RAS ~ $ /home/pi/41
Kannst du mir sagen mit welcher Zeile ich zur Sicherheit die Berechtigungen für den Apache setzen kann auf 40 und 41? Der in dem einen Link scheint mir da auch keine große Ahnung zu haben. ;)

Hier nochmal genauer der (aktuelle) Inhalt der Dateien.

index.html
<html><body><center>
<br><br>
<h1>Funksteckdose!</h1>
<a href="41.php"><img src="an.png"></a>  
<br>
<br>
<a href="40.php"><img src="aus.png"></a>  
</center></body></html>

41.php
<?php
shell_exec ('/home/pi/41');  
header("Location:index.html");  
?>


40.php
<?php
shell_exec ('/home/pi/40');  
header("Location:index.html");  
?>

41
cd /home/pi/wiringPi/raspberry-remote/
sudo ./send 10101 4 1

40
cd /home/pi/wiringPi/raspberry-remote/
sudo ./send 10101 4 0


Danke Peter
116830
116830 03.04.2015 um 12:45:01 Uhr
Goto Top
Um Dateien zu "sparen" würde ich das ganz wie folgt abändern:

40 und 41 löschen (außer du möchtest die Dosen auch via SSH steuern)

Mittels visudo dem Nutzer www-data sudo-Rechte verpassen, allerdings nur auf folgenden Befehl:
/home/pi/wiringPi/raspberry-remote/send*
Somit darf der Nutzer www-data den Befehl mit jeglichen Parametern als root ausführen.

Folgende Zeile muss mittels visudo hinzugefügt werden:
www-data ALL=NOPASSWD:/home/pi/wiringPi/raspberry-remote/send*

Danach würde ich die 40.php und 41.php nach folgendem Schema abändern:
<?php
shell_exec ('sudo /home/pi/wiringPi/raspberry-remote/send 10101 4 0');  
header("Location:index.html");  
?>

Ich kann es gerade nicht testen, weil ich nur mobil unterwegs bin, aber prinzipiell sollte das so laufen.
peterha
peterha 03.04.2015 um 18:20:11 Uhr
Goto Top
Ich möchte die Dateien schon gern beibehalten. Insofern die die Zeilen, die du netterweise geschrieben hast nicht passend für mich.

Jetzt sitze ich schon 10 Stunden an diesem Linux-Frickelzeug... Sind sicher nur 2 Zeilen.
Vermutlich darf nur der www-data nicht drauf zugreifen. Ich habe eben mal die 41 in /var/www kopiert und den Pfad angepasst in der 41.php. Bringt natürlich auch nichts...
116830
116830 03.04.2015 um 22:52:06 Uhr
Goto Top
Du kannst das oben genau so übernehmen, solange du nur die Parameter des send-Befehls änderst. Wichtig ist eben, dass man via visudo einmal dem Nutzer www-data das Ausführen des Skriptes als root erlaubt, denn ohne geht es nicht.

Natürlich funktionieren deine beiden "Skripte" 40 und 41, denn auch hier wird der sudo-Befehl vor dem eigentlichen Befehl ausgeführt. Der Nutzer pi ist in dem sog. sudoers-file, das du mittels des Befehls visudo bearbeiten kannst, ebenfalls eingetragen. Was bedeutet sudo? Führe den folgenden Befehl mit root-Rechten aus. Warum diese nötig sind habe ich oben in einem kurzen Satz erläutert.


Die ganz unsaubere quick and dirty Lösung:
Die Datei "/etc/rc.local" bearbeiten und mit folgendem Inhalt vor der Zeile "exit" befüllen:
chmod -R 666 /sys/class/gpio/
Pi neustarten und freuen. Diese Lösung ist allerdings absolut unsicher und sollte eigentlich nicht angewandt werden!