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'.
Essayez les suggestions suivantes:
php -r "echo exec('whoami');"
r-x
permissions de drapeau: chmod 755 dir; chmod 755 file
+s
(Sudo) au fichier (non recommandé): chmod u+s file
,safe_mode
.include_path
, par exemple :php.ini
file: include_path ".:/usr/local/lib/php:/your/dir"
.htaccess
fichier: php_value include_path ".:/usr/local/lib/php:/your/dir"
/bin/sh
) par votre utilisateur Apache (par exemple, vérifiez avec: finger
).php.ini
n'utilise pas: disable_functions
pour la fonction exec
selinux-utils
(un système Linux à sécurité renforcée), vérifiez la configuration getenforce
/setenforce
comme décrit dans la réponse @ Tonin .php.ini
ou httpd.conf
, n'oubliez pas de redémarrer le serveur Web,php.ini
tous les types d’erreurs (display_error
, error_reporting
, etc.).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
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.
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.