Redirecionando saída de comando para arquivo com sudo

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

[ Hits: 20.084 ]

Blog: https://www.instagram.com/alexabolada/

 


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

Os comandos apropos, makewhatis e whatis

Instalação e Configuração do Oracle Express Edition e SQL Developer no Ubuntu

Como evitar execução de backdoors em diretórios de upload do teu site

Como passar parâmetros para um alias no Bash

Trophy, um jogo de corrida de carros muito legal

Leitura recomendada

Removendo comentários (#) dos arquivos de configuração

Montar ISO sem uso de programas

Formas para forçar o encerramento de programas travados

Instale o kernel 3.10 no elementary OS

Comandos de manipulação de terminal

  

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