Compago

...free knowledge

 
  • Increase font size
  • Default font size
  • Decrease font size
Home Manuali Programmazione Come eseguire un programma esterno in PHP

Come eseguire un programma esterno in PHP

E-mail Stampa PDF

In questo articolo mostreremo come è possibile eseguire un programma esterno o uno script usando il linguaggio PHP.
Le funzioni che si occupano di eseguire dei comandi sono quattro:

  • shell_exec()
  • exec()
  • system()
  • passthru()

Tutte hanno come parametro in ingresso la stringa del comando che dovranno eseguire, ma vediamo le differenze e quando occorre usarle.

Shell_exec()

La funzione shell_exec è definita nel seguente modo:

string shell_exec( string $cmd )

Esegue il comando fornito come parametro e restituisce l'output del comando. Esempio:

<?php
  $out = shell_exec('ls /tmp');
  echo "<pre>$out</pre>";
?>

Oppure è possibile usare direttamente l'output, senza memorizzarlo in una variabile:

<?php
  echo "<pre>".shell_exec('ls /tmp')."</pre>";
?>

In alternativa è possibile usare l'operatore "backticks" (``), da non confondere con il simbolo di quotatura singola ( ' ' ), il quale è equivalente alla funzione shell_exec().

<?php
  $out = `ls /tmp`;
  echo "<pre>$out</pre>";
?>

Exec()

La funzione exec() è definita nel seguente modo:

string exec( string $command, array &$output, int &$return_var) 

Questa usa come parametri opzionali una variabile array che, dopo l'esecuzione del comando, viene restituita con l'output del comando stesso e una variabile di tipo intero che restituisce lo stato o meglio l'esito del comando appena eseguito.

Il risultato della funzione è l'ultima riga dell'output.

<?php
  $cmd = "ls /tmp";
  $res=exec($cmd,$out,$status);
  echo "<pre>";
  echo "out=";
  print_r($out);
  echo "res=".$res.PHP_EOL;
  echo "status=".$status.PHP_EOL;
  echo "</pre>";
?>

System()

La funzione system() definita come:

string system( string $command, int &$return_var)

Essa ha come parametro opzionale lo stato del comando appena eseguito e restituirà l'ultima riga dell'output del comando eseguito oppure il valore FALSE se il comando non ha avuto un esito positivo.

<?php
  $cmd = "ls /tmp";
  echo "<pre>out=";
  $res=system($cmd,$status); // ->output on the webpage
  echo "res=".$res.PHP_EOL;
  echo "status=".$status.PHP_EOL;
  echo "</pre>";
?>

Diversamente da quello che accadeva con la funzione exec tutto l'output del comando viene reindirizzato verso la pagina web.

quindi

system("ls ./");

è equivalente a

exec("ls ./",$out); 
foreach ($out as $line) {echo $line.PHP_EOL;}

Passthru()

La funzione passthru() definita come:

void passthru ( string $command, int &$return_var)

essa è identica alla funzione system() tranne che non restituisce nessun valore. L'output verrà comunque inviato all pagina web:

<?php
  echo "<pre>";
  passthru('ls /tmp');  // -> output on the webpage
  echo "</pre>";
?>

Tutte e quattro le funzioni sono molto simili e la scelta della funzione da usare dipende dal contesto e non vi sono particolari indicazioni.

Esempi

Un esempio che potrebbe essere utile su webserver con linux è l'uso del comano sudo, e più in generale di comandi in cui occorre qualche input da parte dell'utente:

<?php
  $cmd = 'echo "mypassword" | sudo ls /tmp';
  system($cmd);
?>

Usando un pipe quindi riusciamo a passare, con una riga di comando, la password richiesta dal comando sudo.
Attenzione all'uso dei caratteri di quotatura.

Un altro esempio molto utile è quello riguardante il reindirizzamento dell'output:

<?php
  $cmd = "cat /not_existent_file 2>&amp;1";
  system($cmd);
?>

Tutte le quattro funzioni viste fino ad ora non sono interative, cioè restituiscono l'output solo al termine dell'esecuzione del comando.

 

Funzioni di supporto

Prima di concludere vorrei spiegare in poche parole come e quando usare le funzioni:

  • escapeshellarg
  • escapeshellcmd

Escapeshellarg

La funzione escapeshellarg quota una stringa aggiungendo alle sue estremità il simbolo '. Se all'interno della stringa è presente il simbolo usato per la quotatura, esso verrà codificato e quindi sostituito dalla sequenza '\'' .

viene utilizzata è quando non si ha un controllo diretto sull'input di una funzione e quindi gli argomenti devono essere "filtrati" in modo da rendere sicura l'esecuzione del comando.

Esempio:

<?php
  $DirName = "test";
  system('mkdir '.$DirName);
?>

viene creata la directory "test"

Ma se il nome della directory inserito contiene uno spazio:

<?php
  $DirName = "test dir";
  system('mkdir '.$DirName);
?>

Il risultato è che verranno create due directory: la prima chiamata "test" la seconda chiamata "dir".

Se invece usiamo la funzione escapeshellarg verrà creata la corretta directory chiamata "test dir":

<?php
  $DirName = "test dir";
  $DirName = escapeshellarg($DirName);
  system('mkdir '.$DirName);
?>

Escapeshellcmd

La funzione escapeshellcmd invece serve per evitare che alcuni caratteri vengano inseriti nella stringa di comando, inserendo uno slash \ davanti a questi caratteri:

# & ; ` | * ? ~ < > ^ ( ) [ ] { } $ \ , \x0A \xFF. ' " %

ritornando all'esempio precedente se la variabile passata fosse l'intera stringa di comando e questa contenesse dei comandi non previsti:

<?php
  $cmd = "mkdir test ; rm -rf $HOME/*";
  system($cmd);
?>

oltre alla creazione della directory verrebbe rimossa qualsiasi cosa dalla home directory dell'utente che esegue il comando.

Se noi usassimo la funzione precedente l'intera riga di comando verrebbe quotata e considerata come una stringa e quindi nessun comando verrebbe eseguito.

Per evitare l'esecuzione di questo comando aggiuntivo dovremo usare la funzione escapeshellcmd che inibisce i caratteri ; $ e *.

<?php
  $cmd = "mkdir test ; rm -rf $HOME/*";
  $cmd = escapeshellcmd($cmd);
  system($cmd);
?>

In questo modo il comando non sarà eseguito perchè la stringa per creare la directory contiene caratteri non consentiti.

Ultimo aggiornamento ( Venerdì 15 Luglio 2011 05:47 )  
Loading

Login