web-dev-qa-db-fra.com

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

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: autorisation refusée'. J'ai vérifié sous quel utilisateur php est exécuté, et cela se fait sous l'utilisateur Apache.

J'ai essayé de changer la propriété du .sh à l'utilisateur Apache, mais il n'y a pas de résultat.

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

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

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

14
Robin Presto

Essayez les suggestions suivantes:

  • Essayez d’exécuter en dessous de la commande test 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 r-x permissions de drapeau:
    • chmod 755 dir; chmod 755 file
  • Assurez-vous que le propriétaire du fichier est votre utilisateur Apache .
    • Essayez également d’ajouter un drapeau +s (Sudo) au fichier (non recommandé):
      • chmod u+s file,
  • Assurez-vous que votre PHP ne fonctionne pas dans un 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 file: include_path ".:/usr/local/lib/php:/your/dir"
      • ou .htaccess fichier: php_value include_path ".:/usr/local/lib/php:/your/dir"
  • Vérifiez si votre Shell est défini pour être valide (par exemple, /bin/sh) par votre utilisateur Apache (par exemple, vérifiez avec: finger).
  • Assurez-vous que votre php.ini n'utilise pas: disable_functions pour la fonction exec
  • Si vous utilisez SELinux ou que vous avez installé selinux-utils (un système Linux à sécurité renforcée), vérifiez la configuration getenforce/setenforce comme décrit dans la réponse @ Tonin .

Dépannage:

  • Si vous avez modifié votre fichier php.ini ou httpd.conf, n'oubliez pas de redémarrer le serveur Web,
  • Consultez votre journal des erreurs Apache pour plus de détails.
  • Activez dans votre php.ini tous les types d’erreurs (display_error, error_reporting, etc.).
9
kenorb

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. Ceci peut être vérifié et temporairement modifié 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 fichier /etc/selinux/config et en définissant la variable SELINUX sur permissive ou disabled.

Mais, , si vous êtes vraiment dans cette situation, pour résoudre ce type de problème est de consulter le fichier journal /var/log/audit/audit.log. Il contiendra tous les événements liés aux règles SELinux. Vous devrez alors probablement donner à votre script le contexte approprié, c’est-à-dire qu’il est autorisé à être exécuté par l’utilisateur Apache/php. La vérification du contexte de sécurité SELinux est effectuée 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 répertorie l'utilisateur, le rôle et le type de chaque fichier/répertoire. Ici, le type httpd_sys_script_exec_t donne aux fichiers du répertoire cgi l’autorisation d’exécuter par httpd. Votre script shell devrait probablement avoir le même type.

Vous pouvez également ajouter les lignes audit.log à la commande audit2allow. Il vous fournira les modifications nécessaires pour rendre SELinux heureux. Mais généralement, les modifications suggérées doivent être apportées à la politique SELinux elle-même, ce qui n'est pas ce que vous devriez 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 décrit différentes manières de le résoudre: http://sheltren.com/stop-disabling-selinux

11
Tonin

Je suis donc arrivé ici après avoir cherché un problème similaire sur Google. J'ai pensé laisser tomber que le commentaire sur SELinux m'avait orienté dans la bonne direction.

Dans mon cas, j’utilisais un script de déploiement Git personnalisé qui utilisait une commande Shell. La commande fonctionne bien sur BASH mais a ensuite "permission refusée" et "pas de référentiel" sur Git. C'était vraiment étrange et je suis passé par de multiples correctifs jusqu'à ce que je suis tombé sur cette réponse.

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

0
Bade Adesemowo

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 une fois. Les autorisations ont ensuite été automatiquement modifiées en 644 et la prochaine tentative d’exécution du script a reçu Permission denied. Cela s'est avéré être un problème de serveur samba pour moi et je n'ai pas remarqué le motif jusqu'à maintenant.

Le contrôle d'assurance qualité Étrange change d'autorisation lors de l'enregistrement du fichier sur une partition Samba à partir d'un éditeur Windows . Je ne connaissais pas l'option map archive = no, même après avoir utilisé des partages Samba pendant une décennie.

Quelque chose à propos de l’utilisation de Notepad ++ sur un bureau Windows modifierait les autorisations des fichiers cibles en 675 au lieu de 775 selon le paramétrage d’umask.

0
Chris K