Como configurar a CLI do PHP no linux ubuntu para executar como www-data?


12

Eu tenho um aplicativo symfony2 no meu ubuntu. O Symfony possui muitos comandos úteis do console (como php app/console cache:clearou php app/console assets:install web).

O problema é que, se eu executá-los como rootusuário, os arquivos recém-gerados terão root:rootusuário / grupo e, se eu acessar meu site, recebo erros (porque o apache não pode ler / modificar esses arquivos -> eles deveriam ter www-data:www-data).

A execução chown www-data:www-dataresolve o problema, mas executá-lo sempre que limpo meu cache não é uma solução.

Como posso configurar a CLI do PHP para sempre ser executada como usuário / grupo www-data?

ou

Como posso executar um comando como um usuário diferente (sendo root, execute-o como www-data)?

Respostas:


23

Execute um comando como outro usuário uma vez:

sudo -u www-data php script.php

Isso deve funcionar se você estiver root.

Como sempre executando o php as www-data, existem várias possibilidades. Você pode criar um shellscript de wrapper simples. Se /usr/bin/phpfor apenas um link direto /usr/bin/php5ou similar, isso será mais simples. Apenas substitua o link virtual (NÃO o arquivo php5) por um script como este:

#!/bin/sh

sudo -u www-data php5 $*

return $?

Isso ainda não foi testado. Lembre-se também de que isso SEMPRE tentará executar php5como usuário www-data, mesmo que o usuário não seja roote possa não ter permissão para fazê-lo. E também pode não ser o que você realmente deseja. Alguns serviços instalados podem ter problemas ao tentar executar o php.

Uma solução (possivelmente melhor) para aplicar somente isso à raiz pode ser deixar o link /usr/bin/phpvirtual em paz e inserir o script /root/bin. Em seguida, adicione essa pasta para PATH via .bashrc, .profileou similar. Se você tiver /etc/skel/.profile, isso pode indicar como isso é feito:

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

Quando estiver no seu .bashrc, .profileou similar, todo novo shell que você abrir permitirá que você execute diretamente quaisquer executáveis ​​(+ x) no $HOME/bin( /root/binpara root).

Dica: Você pode nomear o script do wrapper como algo que phpwwwvocê especifique explicitamente php script.phpou phpwww script.phpdecida se deseja php regular ou sudo'ed.

Outra solução é um alias simples. Coloque isso no seu .bashrc, .profileou similar:

alias phpwww='sudo -u www-data php'

Engraçado, meio ouvido se passou e eu me deparei com minha própria pergunta novamente =) Parece que esqueci de aceitar sua resposta da última vez - acabei de consertar isso, obrigado!
loostro 4/07/2013

O método apelido faz muito sentido sangrenta, e resolveu o meu problema exato
RedactedProfile

1

Respondida por mwargh em ## linux (IRC Freenode.net)


Para executar um comando como um usuário diferente -> alterne para esse usuário usando:

su www-data

Eu ainda estaria interessado (se possível) em configurar o PHP para executar:

root@mycomp php (php script creating a file)

como usuário root

resultará na criação de um arquivo com www-data: www-data user / group

(desta forma, eu não precisaria mudar de root para www-data para executar meus comandos)


1

Eu tentaria tornar o / usr / bin / php de propriedade do www-data e definir a permissão suid, que força o comando a ser executado pelo proprietário do arquivo. Você faria isso com:

chmod u+s /usr/bin/php

de vocês gostam da notação octal:

chmod 4755 /usr/bin/php

Embora eu deva dizer que isso deve deixá-lo desconfortável sempre que você estiver fazendo da www-data o proprietário de qualquer coisa, pois o objetivo da conta www-data é possuir o mínimo possível.


É por isso que eu vou com o riha resposta
loostro

1

se você tiver o php-fpm (FastCGI Process Manager),
poderá configurá-lo no arquivo de configuração localizado em (pelo menos para centos): /etc/php-fpm.d/www.conf
na linha 39 você pode definir o usuário e 49 o grupo


Isso não se aplica php-cli, não é?
Riha

1

criar arquivo de script:

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

adicionar conteúdo:

#!/bin/bash

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

execute seus scripts a partir da raiz:

phpuid /path/to/script.php

ou use intérprete em seus scripts

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

note: testado no debian 7, você pode precisar instalar o sudo

apt-get install sudo

todos os arquivos criados por script.php terão o mesmo uid desse script

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.