saída do programa de cauda para arquivo no Linux

9

Eu sei que podemos usar o formato abaixo para redirecionar a saída da tela para um arquivo:

$ your_program > /tmp/output.txt

No entanto, quando usei o comando abaixo, ele diz "-bash: /home/user/errors.txt: permissão negada"

sudo tail /var/log/apache2/error.log > ~/errors.txt

Posso saber como fazer essa saída funcionar? O ~ / errors.txt não existe. Preciso criar esse arquivo txt antes de usar o comando redirect?

Xianlin
fonte
11
O que acontece se você digitar echo hi > ~/errors.txt? O /home/userseu diretório pessoal correto (ou o bash de alguma forma ficou confuso sobre onde está o diretório pessoal)?
CJM
O userusuário que executa o comando?
desconhecido utilizador
sim, o usuário é o usuário que executa o comando
Xianlin
Esse é um comportamento normal para sudo. sudonão permite o redirecionamento. muitas maneiras pelas quais as pessoas podem usar isso para fazer coisas impertinentes não incluídas no sudoers.confarquivo. Como alternativa, você pode executar sudo bash -c "tail /var/log/apache2/error.log > ~/errors.txt"para arrastar o final de errors.log para o arquivo no seu diretório home.
Tim Kennedy

Respostas:

17

Atrás do tubo, o sudo não funciona. Não sei por que você não pode gravar em sua casa - talvez o arquivo pertença à raiz?

 sudo tail /var/log/apache2/error.log | sudo tee ~/errors.txt

Talvez você precise de um usuário diferente atrás do tubo. Com certeza, você não precisa de um arquivo preexistente.

Usuário desconhecido
fonte
Sim, isso funcionou ...
Xianlin 20/03/12
Quanto ao problema de permissão, talvez $ HOME seja montado em NFS com rootquash?
Ansgar Esztermann
o $ HOME não está montado pelo NFS.
Xianlin
6

Quando você escreve sudo somecommand > ~/errors.txt, o shell que está chamando sudo(e está sendo executado como você) é quem executa o redirecionamento e a abertura ~/errors.txt. Consulte Redirecionando stdout para um arquivo no qual você não tem permissão de gravação . Normalmente, o problema nesse caso é que você deseja que o root grave no arquivo; veja a pergunta vinculada para saber como fazer isso.

Aqui, é estranho que você não possa gravar em um arquivo no diretório inicial. As chances são de que você salvou anteriormente alguma saída como raiz /home/user/errors.txte esse arquivo agora existe e pertence à raiz. Remova o arquivo (você pode fazer isso desde que tenha permissão de gravação /home/usere poderá criá-lo como seu usuário.

rm ~/errors.txt
sudo tail /var/log/apache2/error.log > ~/errors.txt

Se o arquivo realmente não existir, você não terá permissão de gravação no diretório inicial. Embora tecnicamente possível, e na verdade ocasionalmente útil para alguns usuários restritos, é muito incomum.

Gilles 'SO- parar de ser mau'
fonte
Tentei excluir '/home/user/errors.txt' e use o comando acima. Não funcionou, ainda me proíbe escrever no diretório inicial. Enfim, acho que o link que você forneceu pode usar como minha solução. É o mesmo que a primeira resposta deste post. No entanto, você deu uma explicação detalhada sobre o redirecionamento de stdout para um arquivo e agradeço por isso.
Xianlin