Exécuter 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ésent dans / var / www / html et l’autre est un script Bash appelé testscript présent dans / home / testuser.

Mon script client.php ressemble à

&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 

Je reçois la sortie suivante sur le terminal

 Testscript run successful 

Mais quand j’ouvre la page à

 http://serverdomain/client.php 

Je reçois la sortie suivante

 sh: /home/testuser/testscript: Permission denied 

Je reçois 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.

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

par exemple /var/www/scripts/testscript

Assurez-vous que l’utilisateur / groupe de votre testscript est identique à vos fichiers Web. Par exemple, si votre client.php est détenu par apache:apache , remplacez le script bash par le même utilisateur / groupe en utilisant chown . Vous pouvez découvrir ce que vos fichiers client.php et web possèdent en faisant ls -al .

Puis courir

 &1"); print_r($message); ?> 

MODIFIER:

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

Exécuter les commandes root via PHP

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 exécuté par le serveur Web shell_exec (script de test) avec sudo.

Pour une boîte Debian avec Apache et sudo:

  1. Configurez sudo:

    • En tant que root, exécutez la commande suivante pour modifier un fichier de configuration nouveau / dédié pour sudo:

       visudo -f /etc/sudoers.d/Webserver 

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

    • Ajoutez ce qui suit au fichier:

       www-data ALL = (root) NOPASSWD:  

      est la commande que vous devez être capable d’exécuter en tant que root avec le chemin d’access complet dans son nom (par exemple /bin/chown pour l’exécutable chown ). Si l’exécutable est exécuté avec les mêmes arguments à chaque fois, vous pouvez append 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 (script de test):

    Modifiez votre script de telle sorte que sudo apparaisse avant la commande qui requirejs 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 de ce fichier. Donc, pour notre exemple ci-dessus, nous aurions le texte suivant dans le script:

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

Si vous obtenez toujours une autorisation refusée, le fichier de script et les permissions de son répertoire parent peuvent ne pas permettre 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 didacticiel.

Garder en tete:

Lors de la configuration de sudo, l’objective est d’autoriser la commande dans sa forme la plus restreinte. Par exemple, au lieu de permettre l’utilisation générale de la commande cp , vous n’autorisez la commande cp que 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).

C’est un problème simple. Lorsque vous exécutez à partir du terminal, vous exécutez le fichier php depuis le terminal en tant qu’utilisateur privilégié. Lorsque vous accédez au php depuis votre navigateur Web, le script php est exécuté en tant qu’utilisateur du serveur Web qui ne dispose pas des permissions nécessaires pour 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, procédez comme suit: chown yourusername: www-data / home / testuser / testscript chmod g + x / home / testuser / testscript

Ce qui précède transfère la propriété du fichier à l’utilisateur et lui donne le droit de propriété du groupe de serveurs Web. la commande suivante donne au groupe l’autorisation de l’exécutable. Maintenant, la prochaine fois que vous allez de l’avant et le faites à partir du navigateur, cela devrait fonctionner.

Je me suis débattu avec ce problème pendant trois jours. J’avais défini des permissions sur le script à 755. J’avais appelé mon script comme suit.

  

Mon script était comme suit.

 #!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 apscope pour que le script soit exécuté consistait à append un cd à tmp dans le script:

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

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