ti-enxame.com

Como inserir texto em um arquivo de propriedade raiz usando o sudo?

Possível duplicado:
Redirecionando stdout para um arquivo no qual você não tem permissão de gravação

Executando um comando como Sudo echo 'text' >> /file.txt falha com:

bash: /file.txt: Permission denied
48
tshepang

Isso não funciona porque o redirecionamento é executado pelo Shell, não pelo comando ao qual se aplica. Mas seu Shell não está sendo executado como root, apenas echo 'text' é.

Um truque comum quando você precisa ter permissões de root para gravar em um arquivo, mas não para gerar os dados, é usar tee:

echo 'text' | Sudo tee -a /file.txt

tee também imprime o texto em stdout. Para silenciá-lo, ele se comporta de maneira mais semelhante ao anexo do Shell (>>), direcione o stdout para /dev/null:

echo 'text' | Sudo tee -a /file.txt > /dev/null

Se você precisar de permissões de root para gerar os dados, poderá executar dois comandos Sudo separados ou executar um Shell dentro de Sudo e fazer o redirecionamento para lá (cuidado com a citação).

Sudo echo 'text' | Sudo tee -a /file.txt
Sudo sh -c 'echo "text" >>/file.txt'

Ao sobrescrever em vez de anexar, se você está acostumado com o seu Shell se recusando a truncar um arquivo existente com o > operador (set -o noclobber), lembre-se de que essa proteção não se aplicará. Sudo sh -c 'echo >/etc/passwd' e Sudo tee /etc/passwd substituirá /etc/passwd, você precisaria Sudo sh -o noclobber -c 'echo >/etc/passwd' para que a configuração noclobber também seja aplicada ao sh iniciado por Sudo.

81

Você está dizendo ao bash para abrir um arquivo e anexar a saída do comando Sudo echo 'text', o que obviamente não funciona, já que o seu bash é executado como não raiz. Interativamente, eu normalmente corro Sudo -s para contornar isso (desde então, o Shell é executado como root e pode abrir o arquivo). Como alternativa, você pode executar Sudo sh -c "echo 'text' >> /file.txt", que também funciona, mas é um pouco problemático com toda a interpolação/escape que pode interferir se você tiver expressões complicadas.

8
Thomas Themel