2015-08-04 25 views
10

Ho una pagina web PHP sul mio Raspberry Pi con 2 pulsanti (on e off) Il pulsante on tasto reindirizza a On.php Il pulsante off reindirizza a Off.php In "/ usr/lib/cgi-bin" ho uno script python che vorrei eseguire (script.py) posso perfettamente eseguirlo dal terminale digitandoEsegui script Python da PHP

cd /usr/lib/cgi-bin 
sudo python script.py 

funziona se lo faccio dal terminale.

Il problema è il file PHP (On.php) nella mia cartella "/ var/www". Questo è quello che ho scritto:

<?php 
exec('cd /usr/lib/cgi-bin'); 
exec('sudo python script.py'); 
?> 

Perché lo script esecuzione dal terminale, ma non dal mio PHP?

+0

Il vostro super utente dispone di una password? –

risposta

12

Non è possibile utilizzare sudo da uno script PHP. Apache è in esecuzione da un utente (www-data Generaly), in modo da modificare questo file: /etc/sudoers

Quindi aggiungere questa linea:

www-data ALL=(ALL) NOPASSWD:ALL 

cura! questo autorizzerà tutte le funzioni a essere chiamate da uno script PHP, puoi adattare cambiare "ALL" con il tuo script o il comando Python.

Poi precisa l'utente nel comando exec:

<?php 
exec('sudo -u www-data python /usr/lib/cgi-bin/script.py') 
+0

Rimuove le password? Perché ho la porta del server inoltrata pubblicamente. Non vorrei che nessuno inserisse il mio server. – ChubbyChocolate

+0

Rimuoverà la password dell'utente www-data, ecco perché puoi chiedere a NOPASSWD qualche comando, come 'NOPASSWD: python'. Non cambierà qualcosa per gli altri utenti. –

+0

Ok, non sono un esperto, volevo solo assicurarmi che nessuno potesse hackerare il mio lampone come superutente o qualsiasi altro utente. – ChubbyChocolate

3

Prova questo, dovrebbe funzionare:

<?php 
system("cd /usr/lib/cgi-bin"); 
system("sudo python script.py"); 
?> 

O anche questo:

<?php 
system("cd /usr/lib/cgi-bin && sudo python script.py"); 
?> 
2

Su un vecchio La distribuzione di Raspbian è necessario per inserire il file in /var/www/file.py. Quindi nel tuo file.php si aggiunge:

{ 
    exec("sudo python /var/www/file.py"); 
} 

In una recente Raspbian Jessie è necessario inserire il file in /var/www/html/file.py, così nel vostro file.php è necessario aggiungere:

{ 
    exec("sudo python /var/www/html/file.py"); 
} 

O semplicemente ? qualsiasi file.py

<?php 
{ 
    exec("sudo python test.py"); 
} 

>

Nota: per far funzionare tutto questo è necessario modificare un file prima per aggiungere queste righe per consentire senza password sudo

sudo nano /etc/sudoers

poi andare in fondo e aggiungere questa

pi ALL=(ALL) NOPASSWD: ALL<br> 
www-data ALL=(ALL) NOPASSWD: ALL 
+0

Non aggiungere mai www-data a sudoers con 'NOPASSWD: ALL'! Questo può trasformarsi in un grosso problema di sicurezza. Vedi il commento di @ dotslash sopra – Dartmouth

+0

sì è possibile se è online questo pi è solo un telecomando di casa che è tutto. Per le persone che leggono non lo fanno per controllare su internet – Code1

+0

Quindi? Se è connesso a una rete, può essere compromesso se qualcuno prova abbastanza duro. Basta non farlo. Ci sono modi migliori, come la risposta di Alberto Pagani. – Dartmouth