PDA

View Full Version : [PHP] Lanciare eseguibile sul server


oro125
20-02-2011, 19:54
Ciao a tutti, premetto che sono alle prime armi con PHP, sto realizzando una piccola interfaccia web per un dispositivo embedded e ho un problema nel fare una cosa.

Su una pagina PHP devo mettere un bottone che una volta schiacciato esegua un'eseguibile sul server, che si occuperò di fare delle operazioni sul server...

Come è possibile realizzarlo? vi posto quello che ho fatto... non ridete perchè sto usando php tipo da 1 giorno :D


<? include("check.php"); ?>
<?php
if (isset($_POST["ledon"])) {
exec("/var/www/./Test.exec");
}
?>
<html>

<CENTER>

<form method=post action="leds.php">
<input type="submit" value="Accendi LED" name="ledon">
</form>

</CENTER>

</body>
</html>


Il server in questione monta una Debian per ARM, server web lighttp e php 5.2

Grazie dell'aiuto

Ciao,
Diego

oro125
22-02-2011, 18:53
Nessuno mi sa aiutare? :stordita:

malocchio
22-02-2011, 22:21
Hai provato il codice che hai scritto?
Funziona?
Se sì, dov'è il tuo dubbio?
Se no, qual è il problema?

La funzione exec è quella che in Php ti serve per eseguire comandi sul server, quindi il primo passo direi che l'hai fatto giusto...

oro125
22-02-2011, 22:28
Hai provato il codice che hai scritto?
Funziona?
Se sì, dov'è il tuo dubbio?
Se no, qual è il problema?

La funzione exec è quella che in Php ti serve per eseguire comandi sul server, quindi il primo passo direi che l'hai fatto giusto...

Ciao, si si il codice l'ho provato! ma non funziona...

TI spiego il mio problema, l'eseguibile in questione si occupa di abilitare una delle linee di uscita digitali GPIO gestite tramite sysfs, l'eseguibile lanciato in locale funziona tranquillamente. Quando visualizzo la pagina WEB e schiaccio il pulsante praticamente non avviene nulla, quindi è come se l'eseguibile non venisse lanciato...

Eppure a me il codice sembra corretto... anche se ammetto che sono veramente alla prime armi con il php.


Ciao,
Grazie

malocchio
22-02-2011, 22:35
Ciao, si si il codice l'ho provato! ma non funziona...

TI spiego il mio problema, l'eseguibile in questione si occupa di abilitare una delle linee di uscita digitali GPIO gestite tramite sysfs, l'eseguibile lanciato in locale funziona tranquillamente. Quando visualizzo la pagina WEB e schiaccio il pulsante praticamente non avviene nulla, quindi è come se l'eseguibile non venisse lanciato...

Eppure a me il codice sembra corretto... anche se ammetto che sono veramente alla prime armi con il php.


Ciao,
Grazie

Fai un po' di sano debug... prova a stampare una stringa ed esempio
echo 'EXEC';all'interno dell'if. Giusto per partire a vedere se la condizione è corretta.

oro125
22-02-2011, 22:52
malocchio ho appena avuti l'illuminazione... :D colpa mia che mi è sfuggito un piccolo dettaglio...

Il server WEB gira sotto l'utente www-data, è vero che l'eseguibile ha permessi 755 quindi può essere lanciato anche dall'utente www-data ma le oprazione che deve compiere l'eseguibile richiedono permessi di root!!!

E' bastato settare il bit di SETUID e tutto adesso funziona correttamente!

Ne approfitto per chiederti una cosa che probabilmente per te è banale, mettiamo che metto in un file la seguente parte PHP e niente altro:

$last_line = system('uname -ar', $retval);


Io mi aspetterei una volta eseguita la pagina di non vedere niente visto che non stampo a video nessuna variabile (mi aspetto di trovare la riga in output dal comando nella variabile $last_line) invee a schermo compare l'output del comando! come mai se io non dico di stampare niente?

Invece per quanto riguarda la variabile $retval il manuale di PHP dice: "If the return_var argument is present, then the return status of the executed command will be written to this variabile." quindi mi sembra di capire che da questa riuscirei a capire se il comando è andato a buon fine o meno... sbaglio?


Ciao

malocchio
22-02-2011, 23:50
malocchio ho appena avuti l'illuminazione... :D colpa mia che mi è sfuggito un piccolo dettaglio...

Il server WEB gira sotto l'utente www-data, è vero che l'eseguibile ha permessi 755 quindi può essere lanciato anche dall'utente www-data ma le oprazione che deve compiere l'eseguibile richiedono permessi di root!!!

E' bastato settare il bit di SETUID e tutto adesso funziona correttamente!

Ne approfitto per chiederti una cosa che probabilmente per te è banale, mettiamo che metto in un file la seguente parte PHP e niente altro:

$last_line = system('uname -ar', $retval);


Io mi aspetterei una volta eseguita la pagina di non vedere niente visto che non stampo a video nessuna variabile (mi aspetto di trovare la riga in output dal comando nella variabile $last_line) invee a schermo compare l'output del comando! come mai se io non dico di stampare niente?

Invece per quanto riguarda la variabile $retval il manuale di PHP dice: "If the return_var argument is present, then the return status of the executed command will be written to this variabile." quindi mi sembra di capire che da questa riuscirei a capire se il comando è andato a buon fine o meno... sbaglio?


Ciao

La risposta alla prima domanda è semplice: http://it.php.net/system
system() is just like the C version of the function in that it executes the given command and outputs the result. :)

Il tuo ragionamento mi sembra giusto, se l'eseguibile che chiami restituisce un valore in base al successo o meno dell'operazione tutto dovrebbe andare come pensi tu.