Redirecionando a saída no shell, permissões

3

Eu tenho uma pergunta sobre permissões.

Distro: Debian GNU / Linux 6.0.4 (squeeze)

Então eu tenho uma pasta com um script php nela. A pasta e o arquivo são de propriedade do User1

Se eu fizer isso:

php script.php

Recebo um erro de permissão negada. Justo; Eu sou User2, não User1. Se eu fizer

sudo php script.php

isso funciona porque minha conta de usuário está configurada para isso.

Então eu escrevi este script para aceitar um argumento opcional para mostrar algumas coisas, como um modo "debug", então se eu fizer isso:

sudo php script.php debug

Produz algumas coisas para o CLI. Até aí tudo bem.

Mas, às vezes, a saída do script é muito longa e não consigo rolar para cima para ver a saída desde o início, portanto, desejo redirecionar a saída para um arquivo.

Então tentei o seguinte:

Isso me dá uma permissão negada erro.

sudo php script.php debug >> results.txt

Isso funciona

sudo touch results.txt
sudo chown User1 results.txt
sudo chmod 777 results.txt
sudo php script.php debug >> results.txt

Como alternativa, isso funciona

sudo su -
php script.php debug >> results.txt

Então, o que eu quero saber é ... por que o primeiro me deu uma permissão de erro negado? Eu pensei que o ponto do prefixo sudo é que eu execute o comando como root, que funciona para executar o script php ... mas parece-me que isso não se estende a executar o redirecionamento? Alguém pode explicar por quê?

EDITAR:

Então, encontrei algo de outro post aqui que funciona:

sudo php script.php debug | sudo tee results.txt

A resposta confirma minha suspeita sobre o redirecionamento que está sendo executado sob meu usuário e não sobre o sudo, mas não explica por que ... alguém pode explicar por quê?

    
por Crayon Violent 15.03.2013 / 15:43

1 resposta

3

Ao trabalhar em uma linha de comando, o shell faz primeiro os redirecionamentos e, depois disso, executa o execve ao comando externo. Isso significa que os redirecionamentos são realizados com direitos de usuário inalterados (porque o shell não se preocupa com o envolvimento do sudo mais tarde).

O comando sudo que poderia facilmente fazer >> results.txt não vê isso, mas apenas obtém um descritor de arquivo alterado para / dev / stdout.

Duas possibilidades:

  1. Você faz o redirecionamento para um arquivo / diretório que é gravável para você (User2).
  2. Você escreve um script de wrapper que faz isso e chama o script wrapper via sudo.
por 15.03.2013 / 15:50