Le script PHP ne peut pas exécuter le script bash. sh: Autorisation refusée

14

J'essaie d'exécuter un script .sh à partir de PHP, mais il ne s'exécute pas.

J'ai vérifié les journaux d'erreurs et j'obtiens l'erreur «sh: Permission refusée». J'ai vérifié sous quel utilisateur php est exécuté, et c'est fait sous l'utilisateur apache.

J'ai essayé de changer la propriété du .sh en utilisateur apache, mais il n'y a aucun résultat.

Au début, je pensais que c'était parce que le script était en dehors du répertoire www / dir, mais même lorsque je mets le script dans le même répertoire, l'erreur est toujours donnée.

Y a-t-il d'autres solutions à cela que d'ajouter l'utilisateur apache à la liste SUDOers?

Le script sh fonctionne bien si je le lance à partir de putty en utilisant la commande 'php filename.php'.

Robin Presto
la source
3
Est-ce un script shell ou un fichier PHP? Votre dernier paragraphe n'est pas clair à ce sujet. Avez-vous également défini des autorisations d'exécution ( x) sur le fichier? Avez-vous spécifié l'interpréteur de script dans une ligne de shebang?
Daniel Beck
C'est un script bash à exécuter depuis PHP. Oui, j'en ai fait un exécutable et j'ai spécifié l'interpréteur de script. Cela fonctionne correctement lorsque j'exécute le script PHP à partir de putty et que le script bash est appelé et s'exécute correctement. Mais si j'exécute le script php à partir du webbrowser, il n'exécute pas le script bash et il fera cette erreur car il fonctionne en tant qu'utilisateur apache et non pas l'utilisateur que j'utilise dans putty.
Robin Presto
1
Essayez chmod 775 yourscript.sh. Cela donnera r-x(lire et exécuter) des autorisations aux utilisateurs "Autres" sur ce fichier.
Rhyuk
Je l'ai essayé. Pas de chance .. Je ne peux pas connaître la raison exacte jusqu'à demain. Je n'ai pas accès aux journaux de mon emplacement. Je vous répondrai les gars. Merci de votre aide. :)
Robin Presto

Réponses:

10

Essayez les suggestions suivantes:

  • Essayez d'exécuter la commande de test ci-dessous et vérifiez si cela a fonctionné:
    • php -r "echo exec('whoami');"
  • Assurez-vous que tous les répertoires parents et les fichiers ont au moins des r-xautorisations d'indicateur:
    • chmod 755 dir; chmod 755 file
  • Assurez-vous que le propriétaire du fichier est votre utilisateur Apache .
    • Essayez également d'ajouter un +sindicateur (sudo) au fichier (non recommandé):
      • chmod u+s file,
  • Assurez-vous que votre PHP ne fonctionne pas dans a safe_mode.
  • Assurez-vous que le script se trouve dans votre racine Apache:
    • Sinon, déplacez le script à l'intérieur,
    • ou ajoutez ce répertoire à votre configuration Apache,
    • ou ajoutez ce répertoire à votre include_path, par exemple:
      • php.ini fichier: include_path ".:/usr/local/lib/php:/your/dir"
      • ou .htaccessfichier:php_value include_path ".:/usr/local/lib/php:/your/dir"
  • Vérifiez si votre shell est défini sur valide (par exemple /bin/sh) pour votre utilisateur Apache (par exemple, vérifiez avec:) finger.
  • Assurez-vous que votre php.inin'utilise pas: disable_functionsfor execfunction
  • Si vous utilisez SELinux ou avez selinux-utilsinstallé (un système Linux sécurisé ), vérifiez getenforce/ setenforceconfiguration comme décrit dans la réponse @Tonin .

Dépannage:

  • Si vous avez modifié votre fichier php.iniou httpd.conf, n'oubliez pas de redémarrer le serveur Web,
  • Consultez votre journal des erreurs Apache pour plus de détails.
  • Activer votre php.initoutes sortes d'erreurs ( display_error, error_reporting, etc.).
Kenorb
la source
1
C'était mon problème .. le répertoire parent n'avait pas de droits d'exécution ... ça marche maintenant! Je vous remercie! :)
Robin Presto
Toujours pas de chance pour moi :( Des suggestions? `` `[Root @ kiwi tmp] # ls -ld /; ls -ld / tmp; ls -ld / tmp / sleep; grep '^ include_path = \ | ^ safe_mode =' /etc/php.ini dr-xr-xr-x. 27 root root 4096 Sep 3 12:31 / drwxrwxrwt.4 root root 4096 Sep 3 15:45 / tmp -rwxr-xr-x. 1 root root 24 Sep 3 15:39 / tmp / sleep safe_mode = Off include_path = "/ tmp: / home / kiwi_build" `` `
pihentagy
1
Argh, setenforce l'a résolu. OMG
pihentagy
13

Un tel problème peut dépendre du système d'exploitation que vous utilisez et de sa configuration. Certaines distributions Linux (principalement celles basées sur RHEL comme CentOS ou Fedora) sont livrées avec SELinux activé par défaut. Cela peut être vérifié et modifié temporairement avec les commandes suivantes:

root@ls:~# /usr/sbin/getenforce 
Enforcing
root@ls:~# /usr/sbin/setenforce Permissive
root@ls:~# /usr/sbin/getenforce 
Permissive

Vous pouvez également avoir une vue plus complète de la configuration actuelle avec:

root@ls:~# /usr/sbin/sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

Cette modification peut être rendue permanente en modifiant le /etc/selinux/configfichier et en définissant la SELINUXvariable sur permissiveou disabled.

Mais, la bonne façon de résoudre ce type de problème , si vous êtes effectivement dans cette situation, est de vérifier le /var/log/audit/audit.logfichier journal. Il contiendra tous les événements liés aux règles SELinux. Vous devrez alors probablement donner à votre script le contexte correct, c'est-à-dire être autorisé à être exécuté par l'utilisateur apache / php. La vérification du contexte de sécurité SELinux se fait avec ls -Z:

root@ls:~# ls -alZ /var/www/cgi-bin/
drwxr-xr-x  root root system_u:object_r:httpd_sys_script_exec_t .
drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t ..

Cette liste l'utilisateur, le rôle et le type de chaque fichier / répertoire. Ici, le httpd_sys_script_exec_ttype donne aux fichiers du répertoire cgi l'autorisation d'être exécuté par httpd. Votre script shell devrait probablement avoir le même type.

Vous pouvez également alimenter les audit.loglignes de la audit2allowcommande. Il vous fournira les modifications nécessaires pour rendre SELinux heureux. Mais généralement, les changements suggérés doivent être effectués sur la politique SELinux elle-même, ce qui n'est pas ce que vous devez faire dans votre cas (néanmoins, cette sortie peut donner une idée de ce qui se passe).

La page suivante décrit un problème similaire et différentes façons de le résoudre: http://sheltren.com/stop-disabling-selinux

Tonin
la source
Merci pour la réponse détaillée! Hélas, comme je l'ai mentionné, je ne peux pas avoir un accès root avant demain. Je vous recontacterai donc aussi! :) Et oui, j'utilise CentOS.
Robin Presto
J'ai adoré votre réponse, très informative! Malheureusement, je n'ai pas choisi le vôtre car l'application était désactivée et ce n'était pas le problème. Bien que j'aie beaucoup appris de votre réponse, merci. Je vous voterai quand j'aurai assez de réputation :)
Robin Presto
Pas de soucis, heureux de savoir que vous avez appris de mon message!
Tonin
Si getenforced est le problème, il n'est vraiment pas évident de savoir ce qui se passe. Cela m'a sauvé la journée!
pihentagy
1

Je suis donc arrivé ici après avoir recherché un problème similaire sur Google. Je pensais laisser tomber que le commentaire sur SELinux m'indiquait dans la bonne direction.

Dans mon propre cas, j'utilisais un script de déploiement Git personnalisé qui utilise une commande shell. La commande fonctionne très bien sur BASH mais a ensuite "permission refusée" et "pas un référentiel" sur Git. C'était vraiment étrange et je suis passé par plusieurs correctifs jusqu'à ce que je tombe sur cette réponse.

root@ls:~# /usr/sbin/setenforce Permissive résolu le problème pour moi.

Bade Adesemowo
la source
0

Ma situation est légèrement différente, mais Google m'a amené ici, alors j'ai pensé partager ...

Mon serveur exécute Debian stable et tente d'exécuter un script shell a fonctionné une fois, puis les autorisations ont changé automatiquement en 644 et la prochaine tentative d'exécution du script a été obtenue Permission denied. Cela s'est avéré être un problème de serveur samba pour moi et je n'ai pas remarqué le modèle jusqu'à présent.

L' autorisation QA Strange change lorsque l'enregistrement d'un fichier sur une partition Samba à partir d'un éditeur Windows était le correctif. Je ne connaissais pas l' map archive = nooption même après avoir utilisé des partages de samba pendant une décennie.

Quelque chose à propos de l'utilisation de Notepad ++ sur un bureau Windows changerait les autorisations des fichiers cibles en 675 au lieu de 775 lors de la configuration de l'umask.

Chris K
la source
-7

Exécuter des commandes root en PHP via Apache

J'ai une application web qui doit exécuter des commandes shells en tant que root dans une fonction PHP, et vous penseriez que ce serait assez simple ... mais il m'a fallu quelques googles pour obtenir tous les détails, alors voici mes notes pratiques sur il. C'est sur un système Linux exécutant Apache, et nous utiliserons "sudo" dans "shell_exec" pour exécuter les commandes.

L'essentiel est d'éditer le fichier / etc / sudoers, et généralement vous pouvez (en tant que root) utiliser la commande ”visudo” pour le faire.

Assurez-vous qu'apache peut exécuter des commandes ET ne nécessite pas de mot de passe:

apache  ALL=(ALL)       NOPASSWD: ALL

Ensuite, vous devez commenter cette ligne:

#Defaults    requiretty

Si vous ne le faites pas, vous verrez ces erreurs dans / var / log / secure: "désolé, vous devez avoir un tty pour exécuter sudo". Vous êtes maintenant prêt à partir et le code PHP est simple:

$ results = shell_exec ('sudo date');

متعب المغيري
la source
5
C'est une terrible idée. Si votre installation apache est compromise ou que l'application que vous exécutez le fait ... votre pirate obtient un accès complet au système beaucoup trop facilement. La bonne chose est de changer les permissions sur le script, pas de laisser les choses grandes ouvertes
Journeyman Geek
2
Je me sens obligé d'émettre un downvote sur cette réponse en raison des problèmes de sécurité évidents avec donner à l'utilisateur / rôle apache toutes les autorisations.
Ramhound
@JourneymanGeek Ce n'est pas "si", c'est quand l'installation est compromise.
Michael Hampton