9
votes

PHP Exec: ne retourne pas la sortie

J'ai ce problème: Sur un serveur Web ISS, Windows 7 X64 Professional, Zend Server installé. Exécuter cette commande sous PHP: xxx

$ sortie est vide, $ err = 1. SO EXED ne réagit pas la sortie, elle semble avoir des erreurs. Php désactiver_fonctions est vide, PHP n'est pas en mode sans échec, est standard, je vérifie toute option. Il semble s'agir d'une erreur générale, même de rechercher sur Google ne donne pas de résultats.

Écrivez à chacun son expérience et des solutions éventuelles ou de solutions de contournement.


5 commentaires

Peut-être parce qu'il y avait une erreur? :) Vérifiez quelle erreur 1 code signifie ...


Si je lance la même commande sur CMD Shell avec PHP Script.php, cela fonctionne, lorsque je le lance à partir du navigateur (SO Server Web), cela ne fonctionne pas, je ne comprends vraiment pas où l'erreur est


@albanx: Cela me conduirait à croire aux autorisations si cela fonctionne lorsque vous l'exécutez et non lorsque IIS est.


@ALBANX ESSAYEZ APPENDANT 2> & 1 à la commande que vous exécutez et voyez si vous pouvez voir des messages d'erreur.


Même 2> & 1 ne pas donner le résultat, je pense aussi que cela peut être un problème d'autorisation mais je ne peux pas le comprendre, je donne à l'utilisateur IIS toute la permission possible


10 Réponses :


-1
votes

Jetez un coup d'œil à Apache Error_log, vous trouverez peut-être le message d'erreur.

Aussi, vous pouvez essayer d'utiliser Popen au lieu d'EXEC. Il donne plus de contrôle car vous pouvez séparer le processus de démarrage de la sortie en lecture: xxx


2 commentaires

Il est sous Windows avec un serveur IIS cependant.


J'essayais de trouver un journal IIS, mais je ne comprends pas où ils sont sur Win7



15
votes

Il existe quelques publications sur les sections correspondantes du manuel PHP tel que Celui-ci :

J'avais du mal à utiliser la commande php Exec pour exécuter n'importe quel lot déposer. Exécuter d'autres commandes (c'est-à-dire "," dir ") fonctionne bien). Mais si je Exécuté un fichier de commandes, j'ai reçu aucune sortie de la commande EXEC.

La configuration du serveur I est composée de Server Windows Server 2003 Server en cours d'exécution IIS6 et PHP 5.2.3. Sur ce serveur, j'ai:

  1. accordé des autorisations d'exécution à l'utilisateur Internet sur C: \ Windows \ System32 \ cmd.exe.
  2. a accordé tout le monde-> Contrôle complet du répertoire dans lequel le fichier de commandes est écrit.
  3. a accordé tout le monde-> Contrôle total sur l'ensemble du répertoire C: \ Cygwin \ bin et son contenu.
  4. a accordé aux autorisations "Connexion en tant que lot".
  5. spécifié le chemin complet de chaque fichier étant exécuté.
  6. Testé ces scripts en cours de la ligne de commande sur le serveur et ils fonctionnent tout à fait.
  7. assurait que% Systemroot% \ System32 est dans le chemin du système.

    Il s'avère que même avec tout ce qui précède en place sur le serveur, je a dû spécifier le chemin complet de cmd.exe dans l'appel Exec.

    Quand j'avais utilisé l'appel: $ sortie = EXEC ("C: \\ Windows \\ System32 \\ cmd.exe / c $ $ BatchfileTorun ");

    Alors tout a bien fonctionné. Dans ma situation, $ batchfileTorun était le chemin du système réel du fichier de commandes (c'est-à-dire le résultat d'un appel à realpath ()).

    Il y a quelques autres sur le exec et shell_exec pages manuelle. Peut-être que les suivants seront peut-être suivra et travailleront pour vous.


1 commentaires

Je vais essayer de suivre ces étapes, mais ce n'est pas une exécution par lots.



0
votes

à des fins de sécurité, votre serveur peut avoir un accès restreint à la commande "EXEC". Dans ce cas, vous devez peut-être contacter la société d'hébergement pour supprimer cette restriction (s'il y en a une).


1 commentaires

J'ai des serveurs locaux et EXEX n'a ​​pas de restriction comme je sais



9
votes

La principale raison pour laquelle vous obtenez zéro sortie d'une commande telle que dir code> est parce que dir code> n'existe pas. Cela fait partie de l'invite de commande et la solution à ce problème particulier est bien, dans cette page quelque part.

Vous pouvez le savoir en appuyant sur win + r code> et en tapant dans DIR code> ou Démarrer code>, un message d'erreur apparaît! P>

Cependant, par pervers, cela peut sonner, j'ai constaté que le moyen le plus fiable de faire quelque chose de processus dans Windows est avec l'utilisation du modèle d'objet composant. Vous avez dit pour nous de partager nos expériences, non? P>

$ moi entend des gens rire em> p>

regagna votre sang-froid? P>

, d'abord, nous allons créer l'objet COM: p> xxx pré>

alors, nous allons simplement exécuter ce qui doit être exécuté. P>

$sStdOut = $pShell->StdOut->ReadAll;    # Standard output
$sStdErr = $pShell->StdErr->ReadAll;    # Error


0 commentaires

5
votes

Edit: Après quelques recherches, la seule façon de voir exécuter la commande DIR est comme celle-ci: xxx pré>

afin que vous puissiez essayer ma solution à l'aide de: p>

suppress_errors (windows only): suppresses errors generated by this function when it's set to TRUE
bypass_shell (windows only): bypass cmd.exe shell when set to TRUE


0 commentaires

0
votes

Vous pouvez vérifier les permissions de l'utilisateur IIS à cmd.exe xxx pré>

si dans la sortie est une ligne similaire (ordinaire = nom de votre ordinateur): P>

cacls C:\WINDOWS\system32\cmd.exe /E /G COMPUTERNAME\IUSR_COMPUTERNAME:R


0 commentaires

1
votes

Je sais que j'ai choisi une réponse comme je dois le faire, mais je ne comprends toujours pas pourquoi il ne fonctionnera pas sur ma macchine, mais j'ai trouvé une solution de secours (à l'aide de proc_open) en utilisant une autre méthode:

public static function exec_alt($cmd)
{
    exec($cmd, $output);
    if (!$output) {
        /**
         * FIXME: for some reason exec() returns empty output array @mine,'s machine.
         *        Somehow proc_open() approach (below) works, but doesn't work at
         *        test machines - same empty output with both pipes and temporary
         *        files (not we bypass shell wrapper). So use it as a fallback.
         */
        $output = array();
        $handle = proc_open($cmd, array(1 => array('pipe', 'w')), $pipes, null, null, array('bypass_shell' => true));
        if (is_resource($handle)) {
            $output = explode("\n", stream_get_contents($pipes[1]));
            fclose($pipes[1]);
            proc_close($handle);
        }
    }
    return $output;
}


1 commentaires

Je pense que la clé à ceci est l'argument bypass_shell . D'après ce que je comprends, exécuté () appels cmd / c sur la commande que vous le transmettez. Et pour une raison quelconque, il ne doit pas manquer de trouver ce fichier initial cmd.exe (peut-être à cause de variables d'environnement local ou autre). En contournant la coquille implicite fournie par PHP et indiquez explicitement à la commande d'exécuter "ce document cmd CMD dans ce répertoire particulier", PHP effectue avec succès ce que vous le dites.



1
votes

J'étais le même problème et après avoir passé beaucoup d'heures et de tasse de café

Il suffit de désactiver le contrôle de compte d'utilisateur (UAC) dans Windows 7 Chemin court: p C: \ Windows \ System32 \ userAccountControlsettings.exe et sélectionnez "Ne jamais notifier"

et php Exec () fonctionne bien!

J'utilise: Version Apache: 2.2.11
Version PHP: 5.2.8
Windows 7 SP1 32bit

meilleures salutations! : D


1 commentaires

Je ne me souviens pas maintenant, mais même moi aurait dû handicapé UAC à l'heure, mais même cela devrait être gardé à l'esprit. Bon +1.



2
votes

Essayez ceci: xxx

Ça fonctionne bien sur Windows 8.1 64bits avec UAC activé.


0 commentaires

1
votes

Si vous êtes sur la machine Windows et essayez d'exécuter un exécutable comme celui-ci: xxx

et il n'y a pas de sortie ou votre fichier n'est pas démarré, vous devez essayer ceci: xxx

Ça devrait fonctionner.

Ceci est particulièrement pratique si l'on utilise un chemin relatif de dossier où le script est actuellement situé, par exemple: xxx

et n'oubliez pas de CHDIR () Retour au dossier d'origine si vous devez exécuter d'autres programmes.


0 commentaires