2010-07-12 3 views
0

Je simple cmd.php la page pour exécuter des commandes à l'aide que j'ENTRER shell_exec() et montrer la sortie.PHP - Appel fichier .php de la ligne de commande ne produit pas de sortie

  • PHP est en cours d'exécution en tant que CGI
  • Saisie "php -v" et la plupart des commandes juste montrer "Content-Type: text/html", puis la source HTML de la page en cours.
  • Toutefois, l'appel PHP avec un paramètre non valide (/usr/bin/php -Z) montre l'utilisation phps:

    Utilisation: php [-q] [-h] [-s] [-v ] [-i] [-f] [php args ...]

    etc ...

J'attaché quelques images pour montrer ce que je veux dire.

PHP -v ne produit pas attendu la sortie

PHP -v doesn't produce expected output

PHP -Z montre l'utilisation de PHP

PHP -z shows PHP's usage

Toutes les idées?

Modifier

cmd.php

<?php 

    if (isset ($_POST['submit'])) : 

     $response = shell_exec (escapeshellcmd (stripslashes ($_POST['cmd']))); 

    endif; 

?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
    <head> 
     <style type="text/css"> 
      pre#response { border: 1px solid #e0e0e0; padding: .5em; } 
     </style> 
     <title>Command</title> 
    </head> 
    <body> 
     <form action="cmd.php" method="post"> 
      <p><input type="text" name="cmd" id="cmd" value="<?php echo @htmlspecialchars (stripslashes ($_POST['cmd'])); ?>" size="50" /> 
      <button type="submit" name="submit" id="submit" value="Submit">Submit</button> 
      </p> 
     </form> 


     <?php 
     if (isset ($response)) : 
     ?> 

      <pre id="response"><?php 

       if (empty ($response)) : 
        echo 'No response.'; 
       else : 
        echo htmlspecialchars ($response); 
       endif; 
      ?></pre> 

     <?php 
     endif; 
     ?> 

    </body> 
</html> 
+0

Quelle est la sortie attendue? Pouvons-nous avoir un aperçu de ** cmd.php **? – Anax

+0

Il devrait montrer le numéro de version ... J'ai posté le code source. –

+0

Est-ce que votre FCGI ou CGI s'exécute dans un chroot via un script wrapper? – Borealid

Répondre

1

shell_exec() retourne uniquement les caractères qui ont été écrites au stdout du processus exécuté, mais pas stderr. Essayez redirecting stderr to stdout pour que les messages d'erreur soient stockés dans $ response.

<?php 
define('REDIRECT_STDERR', 1); 

if (isset ($_POST['submit'])) :  
    $cmd = escapeshellcmd (stripslashes ($_POST['cmd'])); 
    if (defined('REDIRECT_STDERR') && REDIRECT_STDERR) : 
    $cmd .= ' 2>&1'; 
    endif; 
    $response = shell_exec($cmd); 
endif; 

?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
    <head> 
    <style type="text/css"> 
     pre#response { border: 1px solid #e0e0e0; padding: .5em; } 
    </style> 
    <title>Command</title> 
    </head> 
    <body> 
    <form action="cmd.php" method="post"> 
     <p> 
     <input type="text" name="cmd" id="cmd" value="<?php echo @htmlspecialchars (stripslashes ($_POST['cmd'])); ?>" size="50" /> 
     <button type="submit" name="submit" id="submit" value="Submit">Submit</button> 
     </p> 
    </form> 


    <?php if (isset ($cmd)) : ?> 
    <fieldset><legend><?php echo htmlspecialchars($cmd); ?></legend> 
     <pre id="response"><?php var_dump($repsonse); ?></pre> 
    </fieldset> 
    <?php endif; ?> 
    </body> 
</html> 
0

Veuillez vérifier php.ini utilisé par php à partir de la ligne de commande. J'ai eu le même problème (pas de sortie de la ligne de commande php), essayé de remplacer php.ini actuel avec php.ini-production et php ligne de commande a commencé à bien fonctionner. Il semble que certaines variables de configuration aient été modifiées dans la version récente de php (mise à jour de 5.3.10 à 5.4.3).

Questions connexes