web-dev-qa-db-fra.com

Exécuter un script Shell à partir d'un script PHP

Je veux exécuter un script Bash présent sur le système à partir d'un script PHP. J'ai deux scripts présents sur le système. L'un d'eux est un script PHP appelé client.php présent à /var/www/html et l'autre est un script Bash appelé testscript présent à /home/testuser.

Mon script client.php ressemble

<?php
  $message=Shell_exec("/home/testuser/testscript 2>&1");
  print_r($message);
?>  

Mon script de test ressemble

#!/bin/bash
echo "Testscript run succesful"

Quand je fais ce qui suit sur le terminal

php client.php

J'obtiens la sortie suivante sur le terminal

Testscript run successful

Mais quand j'ouvre la page à

http://serverdomain/client.php

J'obtiens la sortie suivante

sh: /home/testuser/testscript: Permission denied 

J'obtiens cette erreur même après avoir fait chmod + x testscript.
Comment puis-je le faire fonctionner à partir du navigateur? Veuillez aider.

25
nmadhok

J'aurais un répertoire quelque part appelé scripts sous le dossier WWW afin qu'il ne soit pas accessible à partir du Web mais soit accessible par PHP.

par exemple. /var/www/scripts/testscript

Assurez-vous que l'utilisateur/groupe pour votre testscript est le même que vos fichiers Web. Par exemple, si votre client.php Est détenue par Apache:apache, remplacez le script bash par le même utilisateur/groupe en utilisant chown. Vous pouvez découvrir ce que votre client.php et les fichiers Web appartiennent à ls -al.

Ensuite, exécutez

<?php
      $message=Shell_exec("/var/www/scripts/testscript 2>&1");
      print_r($message);
    ?>  

MODIFIER:

Si vous voulez vraiment exécuter un fichier en tant que root à partir d'un serveur Web, vous pouvez essayer ce wrapper binaire ci-dessous. Découvrez cette solution pour la même chose que vous voulez faire.

Exécutez les commandes root via PHP

14
Panama Jack

Sans vraiment connaître la complexité de l'installation, j'aime bien l'itinéraire Sudo. Tout d'abord, vous devez configurer Sudo pour permettre à votre serveur Web d'exécuter Sudo la commande donnée en tant que root. Ensuite, vous devez disposer du script permettant au serveur Web Shell_exec (script de test) d'exécuter la commande avec Sudo.

Pour une boîte Debian avec Apache et Sudo:

  1. Configurer Sudo:

    • En tant que root, exécutez ce qui suit pour modifier un fichier de configuration nouveau/dédié pour Sudo:

      visudo -f /etc/sudoers.d/Webserver
      

      (ou comme vous voulez appeler votre fichier dans /etc/sudoers.d/)

    • Ajoutez ce qui suit au fichier:

      www-data ALL = (root) NOPASSWD: <executable_file_path>
      

      <executable_file_path> est la commande dont vous avez besoin pour pouvoir exécuter en tant que root avec le chemin complet dans son nom (disons /bin/chown pour le chown exécutable). Si l'exécutable sera exécuté avec les mêmes arguments à chaque fois, vous pouvez ajouter ses arguments juste après le nom du fichier exécutable pour restreindre davantage son utilisation.

      Par exemple, disons que nous voulons toujours copier le même fichier dans le répertoire/root /, nous écririons ce qui suit:

      www-data ALL = (root) NOPASSWD: /bin/cp /root/test1 /root/test2
      
  2. Modifiez le script (script de test):

    Modifiez votre script de telle sorte que Sudo apparaisse avant la commande qui requiert les privilèges root (par exemple Sudo /bin/chown ... ou Sudo /bin/cp /root/test1 /root/test2). Assurez-vous que les arguments spécifiés dans le fichier de configuration Sudo correspondent exactement aux arguments utilisés avec l'exécutable dans ce fichier. Ainsi, pour notre exemple ci-dessus, nous aurions ce qui suit dans le script:

    Sudo /bin/cp /root/test1 /root/test2
    

Si l'autorisation est toujours refusée, le fichier de script et les autorisations de ses répertoires parents peuvent ne pas autoriser le serveur Web à exécuter le script lui-même. Ainsi, vous devez déplacer le script vers un répertoire plus approprié et/ou modifier les autorisations du script et du répertoire parent pour permettre l'exécution par www-data (utilisateur ou groupe), ce qui dépasse le cadre de ce didacticiel.

Gardez à l'esprit:

Lors de la configuration de Sudo, l'objectif est d'autoriser la commande dans sa forme la plus restreinte. Par exemple, au lieu d'autoriser l'utilisation générale de la commande cp , vous autorisez uniquement la commande cp commande si les arguments sont, par exemple, /root/test1/root/test2 . Cela signifie que les arguments de cp (et la fonctionnalité de cp ne peuvent pas être modifiés).

4
Craig Hesling

Je me débattais avec ce problème pendant trois jours. J'avais défini des autorisations sur le script à 755. J'avais appelé mon script comme suit.

<?php
   $outcome = Shell_exec('/tmp/clearUp.sh');
   echo $outcome;
?>

Mon script était le suivant.

#!bin/bash
find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;

Je n'obtenais aucune sortie ou rétroaction. La modification que j'ai apportée pour exécuter le script consistait à ajouter un cd à tmp à l'intérieur du script:

#!bin/bash
cd /tmp;
find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;

C'était plus par chance que par jugement, mais cela fonctionne maintenant parfaitement. J'espère que ça aide.

C'est un problème simple. Lorsque vous exécutez à partir du terminal, vous exécutez le fichier php à partir du terminal en tant qu'utilisateur privilégié. Lorsque vous accédez au php à partir de votre navigateur Web, le script php est exécuté en tant qu'utilisateur du serveur Web qui n'a pas l'autorisation d'exécuter des fichiers dans votre répertoire personnel. Dans Ubuntu, l'utilisateur www-data est l'utilisateur du serveur Web Apache. Si vous êtes sur ubuntu, vous devrez faire ce qui suit: chown yourusername: www-data/home/testuser/testscript chmod g + x/home/testuser/testscript

ce qui précède vous transfère la propriété du fichier par l'utilisateur et en donne la propriété au groupe de serveurs Web. la commande suivante donne au groupe l'exécutable l'autorisation d'accéder au fichier. Maintenant, la prochaine fois que vous allez de l'avant et le faites à partir du navigateur, cela devrait fonctionner.

2
priyolahiri