Passare comandi al sistema in PHP
Da Hacknowledge.
Tramite PHP si possono dare anche dei comandi al sistema sottostante, l'utilità di questa cosa può essere ad esempio l'eseguire programmi esterni non visualizzabili direttamente sul web.
Indice |
[modifica] System()
Ciò si può fare attraverso la funzione system() che ha la seguente sintassi:
system( comando, esecuzione)
La stringa di ritorno memorizza l'ultima riga dell'output.
<?php $comando = "ls"; // Passo il comando al sistema system($comando, $value); // In questo punto verrà stampato a video // L'output // Controllo che il comando sia stato eseguito if (!$value) echo "<br>Comando eseguito!<br>"; else echo "<br>Comando non eseguito!<br>"; ?>Per memorizzare l'output per magari successivamente formattarlo ( tipo cambiando i "\n" con "
" ) è obbligatorio reindirizzare il comando su di un file ad esempio:
<?php $comando = "ls"; $file = "output.txt"; system($comando." > ".$file, $value); ...
[modifica] Escapeshellarg()
La funzione system() però è bene usarla per comandi predefiniti, cioè per una cerchia limitata di comandi che sicuramente non danneggerando il sistema, se si vuole passare un comando inserito come input dall'utente è bene utilizzare la funzione escapeshellarg() che riduce il comando in un solo argomento mettendo le virgolette singole, ad esempio se il nostro scopo è il far vedere il contenuto di cartelle a scelta dall'utente possiamo usare il seguente codice:
<?php // Recupero la cartella $directory = $_POST['cartella']; // Passo il comando al sistema system("ls ".escapeshellarg($directory), $output); // Stampo il comando a video if(!isset($output)) echo "Non è stato riscontrato nessun output"; else echo "L'output è: $output"; ?>
[modifica] Exec()
Exec() è un altra funzione che serve per passare comandi al sistema, non restituisce nessun output e riceve un'unico parametro che il comando da passare al sistema. Restituisce l'ultima riga dell'output un esempio può essere:<?php echo exec("whoami"); ?>
Restituisce la username del proprietario del processo php/httpd attivo (su un sistema con l'eseguibile "whoami" nel path)
[modifica] Attenzione
Se si vuole usare questa funzione per avviare un programma in background è bene memorizzare l'output del programma in un file altrimenti la funzione non terminerà finchè il programma verrà chiuso ( ciò potrebbe portare a blocchi della pagina non piacevoli ;) )

