Redirecionando saída de comando para arquivo com sudo
Dica publicada em Linux / Comandos
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
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
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