Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
Linux: Openbox
Por removido
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha


Dica

Redirecionando saída de comando para arquivo com sudo
Linux user
Publicado por Fábio Berbert de Paula em 03/01/2009

Login: fabio, 6483343 pontos | Blog: https://twitter.com/fabiodovol
[ Hits: 5942 ]

Redirecionando saída de comando para arquivo com sudo

Todos sabem que não é nem um pouco aconselhável utilizar a conta do super-usuário (root) para suas atividades cotidianas, sendo assim ativei sudo para minha conta de usuário comum e sempre que preciso executar algum comando com permissão especial utilizo-o ao invés do su (login como root).

Pois bem, algo que me atormentava era, ao tentar redirecionar a saída de um comando para dentro de um arquivo onde somente o root pode escrever, receber mensagem de permissão de escrita negada.

Vamos tomar como exemplo prático a tentativa de escrita no arquivo /etc/resolv.conf, onde armazena-se a lista dos servidores DNS que a máquina local deverá consultar para resolver nomes.

Como usuário comum comande:

$ echo "nameserver 200.201.202.203" > /etc/resolv.conf
-bash: /etc/resolv.conf: Permission denied

Tentativa de escrita usando o sudo:

$ sudo echo "nameserver 200.201.202.203" > /etc/resolv.conf
-bash: /etc/resolv.conf: Permission denied

O problema ocorre porque a permissão de super-usuário é concebida somente para o comando echo, o redirecionamento da saída do comando gera um novo processo, que é criado sob o bash atual, que tem como dono o usuário comum que executou o sudo, e este não possui as devidas permissões de escrita sobre o arquivo.

Para resolver o problema basta invocar um bash-root e executar o comando por completo dentro dele:

$ sudo bash -c 'echo "nameserver 200.201.202.203" > /etc/resolv.conf'

Problema resolvido!

Encontrei essa solução googlando e caindo neste blog gringo:

Redirecting output to a file with sudo


Outras dicas deste autor

Leitura recomendada
   Dica Linux recomendada Comandos básicos para o modo texto
   Dica Linux recomendada Abrindo o Eterm 'vidro fosco'
   Dica Linux recomendada Os comandos basename e dirname
   Dica Linux recomendada Temas unificados no openSUSE
   Dica Linux recomendada Copiando arquivos e mantendo a estrutura original de diretórios

Comentários
[1] Comentário enviado por eunaoacredito em 03/01/2009 - 13:58h:

Uma outra solução possível é utilizar o comando 'tee':

Por exemplo:
$ sudo bash -c 'echo "nameserver 200.201.202.203" > /etc/resolv.conf'

Equivale a:
$ echo "nameserver 200.201.202.203" | sudo tee /etc/resolv.conf

--------------

Outro exemplo:
$ sudo bash -c 'echo "nameserver 200.201.202.203" >> /etc/resolv.conf'

Equivale a:
$ echo "nameserver 200.201.202.203" | sudo tee -a /etc/resolv.conf


[2] Comentário enviado por fabio em 03/01/2009 - 19:00h:

Hmm, ótima adição don't believe! Essa é uma das maravilhas do Linux, você pode juntar o conhecimento para criar uma variedade enorme de soluções para cada tipo de problema. Nunca havia imaginado usar o tee para fazer isso.

Um abraço.


[3] Comentário enviado por volcom em 25/08/2009 - 12:45h:

Em um script que montei gostaria de direcionar a saída o echo para dois locais diferentes: LOG e Terminal que vou rodar o script para acompanhar o andamento, por exemplo:

Tenho a seguinte linha no me script:

echo "Desabilitando o Firewall..." >> $RSYNC_LOG

Quando executo o script, não aparece no terminal, mas é enviado para o arquivo de log.

Tentei concatenar com | (pipe), mas diz:

echo "Desabilitando o Firewall..." | >> $RSYNC_LOG
-bash: echo: write error: Pipe quebrado

Como posso fazer algo desse tipo?

Tks!

[4] Comentário enviado por fabio em 30/08/2009 - 07:38h:

Olá volcom,

Use o comando tee:

echo "Desabilitando o Firewall..." | tee $RSYNC_LOG

Um abraço.



Contribuir com comentário


  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.