Como anexar a um arquivo como sudo?

271

Eu quero fazer:

echo "something" >> /etc/config_file

Mas, como apenas o usuário root tem permissão de gravação neste arquivo, não posso fazer isso. Mas o seguinte também não funciona.

sudo echo "something" >> /etc/config_file

Existe uma maneira de anexar a um arquivo nessa situação sem precisar primeiro abri-lo com um sudoeditor e, em seguida, anexar o novo conteúdo manualmente?

hsribei
fonte
Estou usando o Ubuntu 9.04 e posso usar o sudo para todos os comandos que eu precisei até agora. Desovar um sub-shell funcionou.
Matt Norris

Respostas:

391

Use tee -a(ou tee --append) comsudo

tee - read from standard input and write to standard output and files
[...]
   -a, --append
      append to the given FILEs, do not overwrite
[...]

Então seu comando se torna

echo "something" | sudo tee -a /etc/config_file

As vantagens de teeexecutar o Bash com permissões administrativas são

  • Você não executa o Bash com permissões administrativas
  • Somente a parte 'gravar no arquivo' é executada com permissões avançadas
  • A citação de um comando complexo é muito mais fácil
akira
fonte
2
No OS X tee, apenas parece ter um sinalizador -a.
Lri
O Debian 8 teetem a -abandeira de acréscimo.
argila
9
Use echo "output" | sudo tee -a file > /dev/nullse você quiser pular a saída do console.
Moshe Bixenshpaner
Funciona bem para WSL também.
precisa saber é o seguinte
50

O redirecionamento é executado no shell atual. Para fazer o redirecionamento com privilégios elevados, você deve executar o próprio shell com privilégios elevados:

sudo bash -c "somecommand >> somefile"
Ignacio Vazquez-Abrams
fonte
26

O sudo gera uma sub-shell:

sudo sh -c "echo 'JAVA_HOME=/usr/lib/jvm/java-6-sun' >> /etc/profile"

Neste exemplo, o sudo executa "sh" com o restante como argumentos.

(isso é mostrado como um exemplo na página de manual do sudo)

Doug Harris
fonte
8
O motivo é que é o seu shell (executando como você) que faz o redirecionamento, não o sudo. Como você não tem permissão para gravar no arquivo, você recebe o erro de permissão negada. O que esta resposta faz é iniciar um novo shell que esteja sendo executado como root e, portanto, capaz de gravar no arquivo.
218 Randy Orrison
Esta não é a resposta certa. Esta é uma resposta certa. Akira tem uma melhor, pela lógica fornecida nessa resposta.
TOOGAM
6

Eu costumo usar o documento shell HERE com o sudo tee -a . Algo ao longo das linhas de:

sudo tee -a /etc/profile.d/java.sh << 'EOF'
# configures JAVA
JAVA_HOME=/usr/lib/jvm/java-8-oracle
export JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
EOF
Nicholas Sushkin
fonte
4

Na minha opinião, o melhor neste caso é dd:

sudo dd of=/etc/profile <<< END
JAVA_HOME=/usr/lib/jvm/java-6-sun
END
user316693
fonte
3

Pode haver um problema com o sudo aqui e o redirecionamento. Use um editor de texto de sua escolha para adicionar a linha.

sudo nano /etc/profile

Ou então, você pode tentar su

su
echo ‘JAVA_HOME=/usr/lib/jvm/java-6-sun’ >> /etc/profile
exit
Bobby
fonte
Infelizmente, isso produziu o mesmo resultado.
Matt Norris
1
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile'Deveria trabalhar. como não há nada que o shell possa expandir por engano no arg para ecoar, aspas simples o comando geral.
quack quixote
Isso é fantástico. Agora faça isso como parte de um script.
Ernie Dunbar
0

Isso não funcionará, você está tentando redirecionar (usando >>) a saída do sudo. O que você realmente deseja fazer é redirecionar a saída do echo. Sugiro que você simplesmente use seu editor favorito e adicione essa linha manualmente a /etc/profile. Isso tem o benefício adicional de que você pode verificar se /etc/profilejá está definido JAVA_HOME.

innaM
fonte
0

Use ex -way:

sudo ex +'$put =\"FOO\"' -cwq /etc/profile

e substitua FOOpela sua variável a acrescentar.

Em alguns sistemas (como o OS X), o /etc/profilearquivo tem 444 permissões; portanto, se você ainda tiver permissão negada , verifique e corrija a permissão primeiro:

sudo chmod 644 /etc/profile

depois tente novamente.

kenorb
fonte