L'exécution d'un script shell à partir d'un script PHP
Je veux exécuter un script Bash présents 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 à /var/www/html
et l'autre est un script Bash appelé testscript
présents à /home/testuser
.
Mon client.php script 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 le suivant sur la borne
php client.php
- Je obtenir la sortie suivante sur la borne
Testscript run successful
Mais quand j'ouvre la page à
http://serverdomain/client.php
- Je obtenir la sortie suivante
sh: /home/testuser/testscript: Permission denied
J'obtiens cette erreur, même après que j'ai fait un chmod +x testscript.
Comment puis-je le faire fonctionner à partir du navigateur? S'il vous plaît aider.
- Que diriez -
read
autorisation?Execute
autorisation est inutile sansread
autorisation. - Apache ne va pas avoir les autorisations pour atteindre dans votre répertoire home. Ni si jamais vous voulez vraiment. Rappelez-vous qu'il ne suffit pas d'accorder des droits pour le script. Vous avez à accorder l'accès à des répertoires, c'est ainsi. par exemple, si je mets un "libre, tenir un" journal de titulaire à l'intérieur d'un coffre de banque, on ne peut prendre les papiers, même s'ils sont gratuits.
- J'ai oublié le chemin des autorisations. Et une bonne analogie.
- je n'ai ls-l et a obtenu le résultat suivant: -rwxr-xr-x 1 apache apache 236 Jun 17 14:05 testscript. Alors, comment dois-je faire? Où dois-je conserver le script, de sorte qu'il peut être exécuté par le script php à partir du navigateur ainsi que le script bash peut exécuter en tant que root.
- le script n'est pas le problème. il est de votre répertoire d'accueil. apache ne peut pas atteindre en elle. ne donnez pas à apache l'autorisation de le faire. déplacer le script quelque part où apache PEUT obtenir à elle.
- je veux le testscript d'avoir les privilèges root. donc je ne peux pas le déplacer dans le répertoire /var/www/html?
- Voir ma réponse. peu importe où il est. la racine peut faire quelque chose et tout, même si la racine n'est pas le propriétaire.
- google pour
visudo NOPASSWD
- Vous aurez besoin de grand
sudo
autorisations de votre serveur sur ce script. Ou enveloppez-le script dans un binaire suid. Mais de toute façon, être très très très TRÈS TRÈS prudent. Appeler le script de mal, passer autour de certaines données de mal, et que vous avez fournies pour les utilisateurs distants avec un shell root sur votre serveur, et boom va de votre serveur. - C'est appelé comme un mauvaise idée. 🙂 Il suffit de ne pas le faire. Vrai risque de sécurité.
- je veux le php pour exécuter le script et l'exécuter en tant que root. Sinon, comment puis-je le faire?
- Une autre méthode est en cours d'exécution d'un démon avec les privilèges appropriés, ce qui n'est pas accessible de l'extérieur le serveur, et écoute très spécifique dans la liste blanche des demandes locales seulement. Toujours être très prudent, mais beaucoup mieux de donner du serveur web de ces privilèges.
- Au lieu de
#!/bin/bash
vous devez utiliser Posix#!/usr/bin/env bash
. Il doit localiser Bash dans d'autres endroits, comme/usr/local/bin
si le présent et sur le chemin.
InformationsquelleAutor nmadhok | 2013-06-17
Vous devez vous connecter pour publier un commentaire.
Je voudrais avoir un répertoire appelé de scripts dans le dossier WWW de sorte qu'il n'est pas accessible depuis le web, mais est accessible par PHP.
par exemple
/var/www/scripts/testscript
Assurez-vous que l'utilisateur/groupe pour votre
testscript
est le même que celui de votre webfiles. Par exemple, si votreclient.php
est détenue parapache:apache
, modifier le script bash pour le même utilisateur/groupe à l'aide dechown
. Vous pouvez trouver ce que votreclient.php
et fichiers web sont la propriété de fairels -al
.Puis exécutez
EDIT:
Si vous voulez vraiment vous exécutez un fichier en tant que root à partir d'un serveur web, vous pouvez essayer ce binaire wrapper ci-dessous. Découvrez cette solution pour la même chose que vous voulez faire.
Exécuter la racine des commandes via PHP
www-data
, mais il fonctionne si l'exécuter avecroot
Sans vraiment savoir la complexité de l'installation, j'aime le sudo route.
Tout d'abord, vous devez configurer sudo pour permettre à votre serveur web pour sudo exécuter la commande en tant que root. Ensuite, vous avez besoin d'avoir le script que le serveur web shell_exec(la testscript) exécuter la commande avec sudo.
Pour Un système Debian avec Apache et sudo:
Configurer sudo:
En tant que root, lancez la commande suivante pour modifier une nouvelle dédiée fichier de configuration de sudo:
(ou ce que vous voulez appeler votre fichier dans
/etc/sudoers.d/
)Ajoutez les lignes suivantes au fichier:
où
<executable_file_path>
est la commande que vous avez besoin pour être en mesure d'exécuter en tant que root avec le chemin d'accès complet dans son nom(par exemple/bin/chown
pour la chown exécutable). Si l'exécutable sera exécuté avec les mêmes arguments à chaque fois, vous pouvez ajouter des arguments à droite après le fichier exécutable du nom de restreindre son utilisation.Par exemple, dire que l'on a toujours envie de copier le même fichier dans /root/répertoire, nous devons écrire la suivante:
Modifier le script(testscript):
Modifier votre script tels que
sudo
apparaît avant la commande qui nécessite les privilèges de root(diresudo /bin/chown ...
ousudo /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:
Si vous êtes encore en train de refus d'autorisation, le fichier de script et c'est répertoires parents' autorisations peuvent ne pas permettre au serveur d'exécuter le script lui-même.
Ainsi, vous devez déplacer le script à un plus approprié de répertoire et/ou de modifier le script et le répertoire parent les autorisations pour permettre l'exécution de www-data(utilisateur ou groupe), qui est au-delà de la portée de ce tutoriel.
Garder à l'esprit:
Lors de la configuration de sudo, l'objectif est de permettre la commande de la forme la plus restreinte. Par exemple, au lieu d'autoriser l'utilisation générale de la cp commande, vous permettent seulement de la cp commande si les arguments sont, disons, /root/test1 /root/test2. Cela signifie que cparguments(et de cp fonctionnalité ne peut pas être modifié).
C'est un problème simple. Lorsque vous exécutez à partir de la borne, vous exécutez le fichier php à partir de la borne comme un utilisateur privilégié. Quand vous allez à l'php à partir de votre navigateur web, le script php est exécuté en tant que l'utilisateur du serveur web qui n'a pas les autorisations pour l'exécution des fichiers dans votre répertoire home. Dans Ubuntu, le www-data de l'utilisateur est le serveur web apache utilisateur. Si vous êtes sur ubuntu, vous devez effectuer les opérations suivantes:
chown nom d'utilisateur:www-data /home/testuser/testscript
chmod g+x /home/testuser/testscript
ce que le ci-dessus ne se transfère la propriété de l'utilisateur du fichier de vous, et donne au serveur de groupe de la propriété. la commande suivante donne le groupe exécutable autorisation pour le fichier. Maintenant, la prochaine fois que vous aller de l'avant et le faire à partir du navigateur, cela devrait fonctionner.
J'ai été aux prises avec ce problème précis pour trois jours. J'ai eu définir des autorisations sur le script à 755. J'avais été d'appeler mon script comme suit.
Mon script était comme suit.
Je recevais pas de sortie ou de la rétroaction. La modification que j'ai faite pour obtenir l'exécution du script a été d'ajouter un cd de tmp à l'intérieur du script:
C'était plus par chance que le jugement, mais il est maintenant fonctionne parfaitement. J'espère que cette aide.