Exécution D'un script Bash à partir D'un script PHP

je veux exécuter le 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ésents dans /var/www/html et l'autre est un script Bash appelé testscript présents dans /home/testuser.

mon client.le script php ressemble à

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

mon testscript ressemble à

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

quand je fais ce qui suit sur 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 le résultat suivant

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? S'il vous plaît aider.

24
demandé sur codeforester 2013-06-17 20:03:12

4 réponses

j'aurais un répertoire quelque part appelé scripts sous le dossier WWW pour qu'il ne soit pas accessible depuis le web mais par PHP.

p.ex. /var/www/scripts/testscript

assurez-vous que l'utilisateur/groupe pour votre testscript est le même que votre webfiles. Par exemple , si votre client.php appartient à apache:apache , changez le script bash pour le même utilisateur/groupe en utilisant chown . Vous pouvez trouver ce que vos client.php et fichiers web sont la propriété de faire ls -al .

puis courir

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

EDIT:

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écuter des commandes racine via PHP

14
répondu Panama Jack 2017-05-23 12:24:18

sans vraiment connaître la complexité de la configuration, j'aime la route sudo. Tout d'abord, vous devez configurer sudo pour permettre à votre serveur web d'exécuter la commande donnée en tant que root. Ensuite, vous devez avoir le script que le serveur web shell_exec's(testscript) exécute 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 éditer un nouveau fichier de configuration dédié pour sudo:

      visudo -f /etc/sudoers.d/Webserver
      

      (ou quel que soit le nom que vous voulez donner à votre dossier dans /etc/sudoers.d/ )

    • ajouter ce qui suit au fichier:

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

      <executable_file_path> est la commande que vous devez pouvoir exécuter en tant que root avec le chemin complet dans son nom (dire /bin/chown pour le chown exécutable). Si l'exécutable sera lancé 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 écrirons ce qui suit:

      www-data ALL = (root) NOPASSWD: /bin/cp /root/test1 /root/test2
      
  2. modifier le script(testscript):

    éditez votre script tel que sudo apparaît devant la commande qui nécessite des privilèges root(dites sudo /bin/chown ... ou sudo /bin/cp /root/test1 /root/test2 ). Assurez-vous que les arguments spécifiés dans le fichier de configuration de sudo correspondre exactement les arguments utilisés avec l'exécutable dans ce fichier. Ainsi, pour notre exemple ci-dessus, nous aurions suivantes dans le script:

    sudo /bin/cp /root/test1 /root/test2
    

si vous obtenez toujours la permission refusée, le fichier de script et ses répertoires parent' les permissions ne permettent pas au serveur web d'exécuter le script lui-même. Ainsi, vous devez déplacer le script vers un répertoire plus approprié et/ou modifier les permissions 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 tutoriel.

gardez à l'esprit:

lors de la configuration de sudo, l'objectif est de permettre la commande dans sa forme la plus restreinte. Exemple, au lieu d'autoriser l'utilisation générale de la commande cp , vous n'autorisez la commande cp que si les arguments sont, disons, /root/test1 /root/test2 . Cela signifie que cp arguments de " (et la fonctionnalité de cp ne peut pas être modifiée).

4
répondu Craig Hesling 2013-06-18 08:41:16

c'est un problème simple. Lorsque vous exécutez depuis le terminal, vous exécutez le fichier php depuis le terminal en tant qu'utilisateur privilégié. Lorsque vous accédez à php depuis votre navigateur web, le script php est exécuté en tant qu'utilisateur du serveur web qui n'a pas les permissions 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 sous ubuntu, vous devez faire ce qui suit:: chown nom d'utilisateur:www-data /home/testuser/testscript chmod g+x / home/testuser /testscript

ce qui précède fait est de vous transférer la propriété utilisateur du fichier, et donne au groupe webserver la propriété de celui-ci. la commande suivante donne le groupe exécutable autorisation pour le fichier. La prochaine fois que vous le faites à partir du navigateur, ça devrait marcher.

2
répondu priyolahiri 2013-06-17 17:36:58

j'ai été aux prises avec ce problème précis pour trois jours. J'avais fixé les permissions sur le script à 755. J'avais été d'appeler 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 pas de résultat ou de rétroaction. Le changement que j'ai fait pour faire tourner le script était d'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 il fonctionne maintenant parfaitement. J'espère que cette aide.

2
répondu Rob EatsEverything Delaney 2014-07-17 11:42:03