Web server Apache2 su Beaglebone Black

4 risposte [Ultimo contenuto]
Ritratto di Stokes12
Stokes12
(Newbie)
Offline
Newbie
Iscritto: 17/02/2018
Messaggi: 3

Ciao a tutti, ho un BeagleBone Black Wireless con installato Debian 8.10. Voglio creare un web server usando apache2 e dovrei usare anche php. Li ho già installati entrambi e sembra funzionare, in quanto questo codice mi dà la corretta schermata:

<?php
  phpinfo();
?>

Ora vorrei provare ad accendere un led quando mi collego all'ip del BeagleBone e quindi ho scritto il seguente programma:

<?php
  system("echo 1 >> /sys/class/gpio/gpio20/value");
?>

Questo non va affatto.
Eppure l'istruzione: echo 1 >> /sys/class/gpio/gpio20/value fa il suo dovere se esaguita da terminale.
Avete dei suggerimenti?
Grazie in anticipo.

Ritratto di badroot
badroot
(Guru)
Offline
Guru
Iscritto: 22/08/2008
Messaggi: 2059

E' un problema di permessi, lo script o comando PHP viene eseguito da apache con un utente che non ha i permessi per modificare quel file. Immagino che tu da terminale lo esegui come root e non come utente "normale".
Di solito è una quasi una sorta di dogma quello di non usare apache, o qualsiasi altro web server, come root proprio per problemi di sicurezza.

Ritratto di Stokes12
Stokes12
(Newbie)
Offline
Newbie
Iscritto: 17/02/2018
Messaggi: 3

Grazie per il consiglio!
In che modo posso risolvere il problema (nel modo più sicuro possibile)?

Ritratto di mcortese
mcortese
(Moderatore)
Offline
Moderatore
Iscritto: 27/02/2009
Messaggi: 2918

Io creerei uno script in /usr/local/bin, chiamato led_on, di una sola riga:

#!/bin/sh
echo 1 > /sys/class/gpio/gpio20/value

Dopodiché mi assicurerei che l'utente con cui gira Apache (mi sembra sia www-data) possa eseguirlo come root senza bisogno di dare la password, creando un file /etc/sudoers.d/led_on con dentro:

# Allow Apache to run led_on as root without password:
www-data ALL = (root) NOPASSWD: /usr/local/bin/led_on

Attenzione ai permessi: lo script led_on deve avere il bit x attivo per essere eseguibile. Il file in sudoers.d deve essere leggibile solo da root, scrivibile da nessuno. In pratica:

chmod x+a /usr/local/bin/led_on
chown root.root /etc/sudoers.d/led_on
chmod 0440 /etc/sudoers.d/led_on

Infine testerei il tutto con una pagina di prova:

<?php
  system("sudo /usr/local/bin/led_on");
?>

Ma non è detto che sia il metodo migliore.

Ritratto di Stokes12
Stokes12
(Newbie)
Offline
Newbie
Iscritto: 17/02/2018
Messaggi: 3

Ottimo, funziona tutto bene!
Grazie