Permissão negada ao tentar gravar um arquivo do script bash executado a partir de www-data

0

Eu tenho um script bash em / var / www / html / exe. Esta pasta é de propriedade da www-data: www-data

O código PHP chama esse script, sendo executado como www-data. Eu testo usando sudo -u www-data script.sh

sudo tee: Recebo permissão negada ao tentar escrever um arquivo do script, por exemplo como um teste:

echo 10 | sudo tee tttt

Solicita a senha do sudo www-data. Isso não vai funcionar.

Arquivo Temp: Eu também tentei escrever um arquivo temporário para a pasta / home / ubuntu, também permissão negada

Nopasswd: Eu também poderia adicionar www-data para não exigir senha no arquivo sudoers. Isso é ruim porque requer uma configuração personalizada extra. A implantação é automatizada e isso aumenta a complexidade do código de implantação.

Shell: Eu tentei várias combinações de execução em um shell diferente, por exemplo $ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE" Estes resultaram na solicitação da senha do sudo www-data, não podem funcionar.

Sudo: Eu não acho que deveria ter (nem eu quero) executar o shell como sudo. Além disso, este é um serviço e exigiria uma alteração no código que não possuo.

Intervenção manual: Muitas das respostas que encontrei sugerem coisas como "faça login como root". Não há humanos por perto para fazer isso: o código é construído e implantado automaticamente em vários ambientes.

Solução alternativa do Hacky: Escreva um cpp exe que grava o arquivo e o chama do script. Eu posso escrever arquivos assim sem problemas. Mas isso parece horrível e adiciona complexidade para construir / implantar.

Depois de ler dezenas de páginas sobre como o Linux lida com permissões e shells, ainda não estou certo de que entendo completamente como shells e subshells interagem com permissões. Eu suspeito que há uma maneira de fazer isso, mas como?

    
por James Creasy 26.08.2016 / 17:31

1 resposta

1

Se um script em execução como usuário www-data executar o comando echo 10 | sudo tee tttt , o usuário www-data solicitará privilégios de root por meio de sudo , algo que provavelmente não é permitido fazer.

Como o próprio script está sendo executado como www-data e você deseja gravar em um diretório pertencente a esse usuário, não há necessidade de sudo : a operação de gravação (o comando tee ) será executada com o privilégios do usuário www-data também. Então, o que você quer é echo 10 | tee tttt , ou apenas echo 10 > tttt .

Como um aparte, considere usando printf em vez de echo para imprimir strings.

    
por fkraiem 26.08.2016 / 17:51