Redirecionando saída de comando para arquivo com sudo

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

[ Hits: 20.521 ]

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

Listando o tamanho de todos os arquivos e diretórios ocultos da HOME

DNS Dinâmico no Linux com ddupdate - DuckDNS

Segredos do comando sleep

Condições if em múltiplas linhas no Python

Como recuperar uma senha salva no Chrome ou Firefox

Leitura recomendada

Criando uma ISO de DVD "bootável" do Slackware

Listar um arquivo de baixo para cima

Inserindo data e hora no comando history

Quem se logou no seu sistema

Copiando arquivos com a estrutura de diretórios

  

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