Como anexar um arquivo como sudo?

224

Eu quero fazer:

echo "something" >> /etc/config_file

Mas, como apenas o usuário root tem permissão de gravação para esse 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 um arquivo a essa situação sem ter que primeiro abri-lo com um editor sudo 'd e, em seguida, anexar o novo conteúdo manualmente?

    
por hsribei 01.05.2010 / 07:50

8 respostas

332

A ferramenta certa para a tarefa certa: ' tee '

tee - read from standard input and write to standard output and files

Então sua linha de comando se torna

% echo "output" | sudo tee -a file

A vantagem de tee sobre a execução do Bash com permissões administrativas é:

  • Você não executa o Bash com permissões administrativas
  • Apenas a parte "gravar em arquivo" é executada com permissões avançadas
  • A citação de um comando complexo é muito mais fácil
por 01.05.2010 / 08:25
40

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"
    
por 01.05.2010 / 07:54
22

Faça o sudo gerar um 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.

(isto é mostrado como um exemplo na página man do sudo)

    
por 13.10.2009 / 16:23
5

Eu costumo usar shell AQUI documento com 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
    
por 16.06.2016 / 18:16
4

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

sudo dd of=/etc/profile <<< END
JAVA_HOME=/usr/lib/jvm/java-6-sun
END
    
por 18.04.2014 / 20:03
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, você poderia tentar o su

su
echo ‘JAVA_HOME=/usr/lib/jvm/java-6-sun’ >> /etc/profile
exit
    
por 13.10.2009 / 16:10
0

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

    
por 13.10.2009 / 16:36
0

Use ex -way:

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

e substitua FOO por sua variável para anexar.

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

sudo chmod 644 /etc/profile

tente novamente.

    
por 25.05.2015 / 00:22