Redirecionando saída de comando para arquivo com sudo

Publicado por Fábio Berbert de Paula em 03/01/2009

[ Hits: 20.303 ]

Blog: https://fabio.automatizando.dev

 


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

Busca Reversa no Mongo Shell

Cliente SSH para Windows

Sistema de Informações em Rede (NIS)

Javascript - pegar um elemento aleatório de uma lista

Forçando quebra de linha em tabelas HTML usando PHP

Leitura recomendada

Erro ao instalar programas/aplicativos .deb no Ubuntu pelo terminal [Resolvido]

Removendo vários arquivos de uma lista gigante (Argument list too long)

GRUB Rescue - recuperando o Grub com 4 comandos

ZIP no GNU/Linux

Como fazer Ubuntu reconhecer a placa de rede NVIDIA Corporation MCP61 Ethernet (rev a2)

  

Comentários
[1] Comentário enviado por Gabriel_Silva 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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts