Una shell in PHP

20 marzo 2006

Funzionalità

Ovviamente non ci sono le tradizionali variabili $_* ($_GET, $_POST, $_COOKIE), sono però accessibili:

  • $_ENV[] (contenente variabili d’ambiente)
  • $_SERVER[] (contenente le stesse variabili d’ambiente di $_ENV più alcune specifiche)
  • $argv[] (contenente i parametri passati all’eseguibile php)
  • $argc (intero corrispondente alla conta degli elementi dell’array $argv)

Possiamo fare alcune osservazioni su queste due ultime variabili: mentre nella versione CLI sono sempre accessibili in questo modo, per le versioni CGI seguono il parametro register_globals del php.ini quindi sono accessibili in maniera diretta se questo parametro è impostato a ‘On’ e in maniera indiretta attraverso l’array $_SERVER ($_SERVER[‘argc’], $_SERVER[‘argv’]) in caso contrario. È necessario osservare che $argc corrisponde al numero di elementi dell’array $argv nel momento in cui lo script viene inizializzato per cui se aggiungerete o toglierete elementi dall’array $argv vi dovrete ricordare di sincronizzare la variabile $argc (ad esempio in questo modo: $argc = count($argv);). Inoltre ricordiamoci che il primo elemento dell’array $argv ($argv[0]) è occupato dal percorso completo dello script eseguito.

La versione CLI dispone inoltre di 3 stream, aperti e chiusi automaticamente dall’interprete nel momento di inizializzazione e uscita dallo script, corrispondenti agli stream di input, output e standard error: STDIN, STDOUT, STDERR. È possibile ottenere la compatibilità nelle versioni CGI tramite le funzioni define e fopen.

define(STDIN, fopen(‘php://stdin’, ‘r’));
define(STDOUT, fopen(‘php://stdout’, ‘w’));
define(STDERR, fopen(‘php://stderr’, ‘w’));

Ovviamente ci saranno molto utili le varie funzioni riguardanti il filesystem e specialmente realpath(), getcwd(), is_file(), file_exists() e ovviamente le funzioni per l’esecuzione di programmi esterni come exec(), escapeshellarg().

Impostazione del programma

Innanzitutto dobbiamo considerare se il nostro programma necessiterà di parametri e se questi saranno opzionali oppure se sarà chiamato semplicemente per eseguire vari compiti prefissati senza possibilità di modifica al volo con flag particolari. Cioè dobbiamo decidere se il nostro script sarà del tipo “EseguiLeAzioniPrefissate” oppure del tipo “EseguiLeAzioni -azione1 -azione2 -azione3”. Inutile dire che il primo stile di programmi è nettamente più semplice da scrivere anche se molto meno flessibile. Oppure potremmo voler fare un programma funzionante in maniera interattiva con menu e scelte.

function menu(){
   echo “Programma per il copia incolla\n\n”;
   echo “Scegli l’opzione che preferisci:\n”;
   echo “a) Copia\n”;
   echo “b) Incolla\n”;
   echo “c) Esci\n\n”;


   $lettera = fread(STDIN, 1);
   return $lettera;
}


$opzione = menu();
if( $opzione == ‘a’ ){
   Copia();
}
elseif( $opzione == ‘b’ ){
   Incolla();
}
elseif( $opzione == ‘c’ ){
   exit();
}
else{
   echo “Errore!\n”;
   exit();
}

Se vuoi aggiornamenti su Una shell in PHP inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Una shell in PHP

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy