Pular para o conteúdo

Redirecionando saída de comando para arquivo com sudo

Dica publicada em Linux / Comandos
Fábio Berbert de Paula fabio
Hits: 20.907 Categoria: Linux Subcategoria: Comandos
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

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

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

giFT: Usando a rede do Kazaa no Ubuntu

Empresa desenvolve CRM que funciona em Linux

Python - capturar a saída do programa em um arquivo ou variável

Como mapear teclas no Vim

SED - salvar resultados em novo arquivo

Calculadora Google

Gerando senhas aleatórias alfanuméricas

Comprometendo a integridade de um arquivo

Inserindo data e hora no comando history

Pesquisa de arquivos e executáveis em pacotes .deb

#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

Entre na sua conta para comentar.