Comment configurer PHP CLI sur Linux Ubuntu pour qu'il s'exécute en tant que www-data?

12

J'ai une application symfony2 sur mon ubuntu. Symfony possède de nombreuses commandes de console utiles (comme php app/console cache:clearou php app/console assets:install web).

Le problème est que si je les exécute en tant rootqu'utilisateur, les fichiers nouvellement générés auront un root:rootutilisateur / groupe, et si j'accède à mon site Web, je reçois des erreurs (car apache ne peut pas lire / modifier ces fichiers -> ils devraient avoir www-data:www-data).

L'exécution chown www-data:www-datarésout le problème, mais l'exécuter chaque fois que j'efface mon cache n'est pas une solution.

Comment configurer PHP CLI pour qu'il fonctionne toujours en tant qu'utilisateur / groupe www-data?

ou

Comment puis-je exécuter une commande en tant qu'utilisateur différent (étant root, l'exécuter en tant que www-data)?

loostro
la source

Réponses:

23

Exécutez une commande en tant qu'autre utilisateur une fois:

sudo -u www-data php script.php

Cela devrait fonctionner si vous l'êtes root.

Quant à toujours exécuter php as www-data, il existe plusieurs possibilités. Vous pouvez créer un script shell simple. Si ce /usr/bin/phpn'est qu'un lien logiciel vers /usr/bin/php5ou similaire, cela le rend plus simple. Remplacez simplement le lien logiciel (PAS le fichier php5) par un script comme celui-ci:

#!/bin/sh

sudo -u www-data php5 $*

return $?

Ce n'est pas testé cependant. Sachez également que cela tentera TOUJOURS de s'exécuter en php5tant qu'utilisateur www-data, même si l'utilisateur peut ne pas être rootet ne pas être autorisé à le faire. Et ce n'est peut-être pas ce que vous voulez vraiment. Certains services installés peuvent rencontrer des problèmes lors de l'exécution de php.

Une solution (peut-être meilleure) pour n'appliquer cela qu'à root peut être de laisser le soft-link /usr/bin/phpseul et de placer le script à la /root/binplace. Ajoutez ensuite ce dossier à PATH via .bashrc, .profileou similaire. Si c'est le cas /etc/skel/.profile, cela peut indiquer comment cela se fait:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Une fois que cela est dans votre .bashrc, .profileou similaire, chaque nouveau shell que vous ouvrez vous permettra d'exécuter directement tous les exécutables (+ x) dans $HOME/bin( /root/binpour root).

Astuce: Vous voudrez peut-être nommer le script de wrapper quelque chose comme phpwwwça, vous spécifiez donc explicitement php script.phpou phpwww script.phpdécidez si vous voulez un php régulier ou sudo'ed.

Une autre solution est un simple alias. Placez ceci dans votre .bashrc, .profileou similaire:

alias phpwww='sudo -u www-data php'
riha
la source
Drôle, une demi-audition s'est écoulée et je suis à nouveau tombé sur ma propre question =) On dirait que j'ai oublié d'accepter votre réponse la dernière fois - je viens de corriger ça, merci!
loostro
La méthode d'alias est tellement sanglante, et elle a résolu mon problème exact
RedagedProfile
1

Répondu par mwargh sur ## linux (IRC Freenode.net)


Pour exécuter une commande en tant qu'utilisateur différent -> basculez vers cet utilisateur en utilisant:

su www-data

Je serais toujours intéressé (si c'est possible) à configurer PHP pour que l'exécution:

root@mycomp php (php script creating a file)

en tant qu'utilisateur root

entraînera la création d'un fichier avec www-data: utilisateur / groupe www-data

(de cette façon, je n'aurais pas à passer de root à www-data pour exécuter mes commandes)

loostro
la source
1

J'essaierais de faire / usr / bin / php détenu par www-data et définir la permission suid, ce qui force l'exécution de la commande par le propriétaire du fichier. Vous feriez cela avec:

chmod u+s /usr/bin/php

vous aimez la notation octale:

chmod 4755 /usr/bin/php

Bien que je doive dire que cela devrait inquiéter chaque fois que vous faites de www-data le propriétaire de quoi que ce soit, car le but du compte www-data est de posséder le moins possible.

Ragoût
la source
C'est pourquoi j'irai avec la réponse de riha
loostro
1

si vous avez le php-fpm (FastCGI Process Manager)
vous pouvez le configurer dans le fichier de configuration situé à (au moins pour centos): /etc/php-fpm.d/www.conf
à la ligne 39, vous pouvez définir l'utilisateur et 49 vous définissez le groupe

VeXii
la source
Cela ne s'applique pas à php-cli, n'est-ce pas?
riha
1

créer un fichier script:

touch /usr/bin/phpuid
chmod +x /usr/bin/phpuid

ajouter du contenu:

#!/bin/bash

UIDX="#"`stat -c '%u' $1`
sudo -u $UIDX php5 $*

lancez vos scripts depuis root:

phpuid /path/to/script.php

ou utilisez l'interpréteur dans vos scripts

#!/usr/bin/phpuid
<?php
phpinfo();

note: testé sur debian 7, vous pourriez avoir besoin d'installer sudo

apt-get install sudo

tous les fichiers créés par script.php auront le même uid que ce script

palmer
la source