Não é possível redirecionar a saída padrão [duplicada]

1

Estou acompanhando os exemplos no Capítulo 6 Redirecionamento do The Linux Command Line (2012). Eu estou tentando redirecionar a saída padrão de um comando ls para um arquivo de texto. Eu continuo recebendo um erro de permissão negada. Estou usando o Ubuntu 13.04. Veja abaixo:

ta2tyrants@Vaio:/$ ls -l /usr/bin >> ls-output.txt
bash: ls-output.txt: Permission denied

Eu tentei executar este comando usando o acesso root e recebo o mesmo erro:

ta2tyrants@Vaio:/$ sudo ls -l /usr/bin >> ls-output.txt
bash: ls-output.txt: Permission denied

O que estou fazendo de errado? Existe uma maneira de contornar isso?

    
por ta2yrants 14.10.2013 / 00:15

1 resposta

4

Solução 1: redirecione para um arquivo que você pode escrever para

Seu diretório de trabalho atual é / , que por padrão só pode ser modificado por root. Digite cd ~ para mudar para sua pasta pessoal, ou cd seguido do caminho para um diretório em que você pode gravar, e faça novamente.

Solução 2: redirecionar com sh sob sudo

Os redirecionamentos de shell não são repassados para os programas. Isso significa que, mesmo que você execute um programa em sudo , o redirecionamento (como >> ) ainda será executado na sua conta. Isso é o que acontece:

  sudo         ls -l /usr/bin         >>/ls-output.txt
-------------------------------------------------------
|     execute external program      | redirect stdout |       what your shell sees
| sudo | command to execute as root |                            what sudo sees

Se você deseja sudo a, você precisa executar um shell como root. Você pode fazer isso:

     sudo         sh   -c '      ls -l /usr/bin           >>/ls-output.txt   '
-------------------------------------------------------------------------------
|      execute external program (pass the single-quoted string verbatim)      | your shell
|    sudo       |                command to execute as root                   |    sudo
                | sh | -c | execute external program |    redirect stdout     | root shell

Dessa forma, o redirecionamento faz parte de uma invocação de sh feita em sudo .

Solução 3: redirecionar com tee sob sudo

Como Oli ♦ sugerido , você também pode enviar seu comando para tee:

       ls -l /usr/bin          |     sudo        tee /ls-output.txt
-------------------------------------------------------------------------
| execute external program | pipe |      execute external program       | your shell
                                  |  sudo  | command to execute as root |    sudo

Observe que tee é executado em sudo , mas não em ls . Isso ocorre porque tee precisa de privilégios de raiz (para gravar em /ls-output.txt ) e ls não. Se o programa que gera a saída fez precisar de privilégios de root, você precisaria de sudo de ambos.

   sudo        ls -l /root              |    sudo        tee /ls-output.txt
--------------------------------------------------------------------------------
|     execute external program      | pipe |     execute external program      | your shell
| sudo | command to execute as root |                                             sudo #1
                                           | sudo | command to execute as root |  sudo #2

Além disso, se você não quiser a saída exibida na tela, poderá adicionar >/dev/null ao final da linha.

    
por Blacklight Shining 14.10.2013 / 00:30