Questão Como anexar um arquivo como sudo?


Duplicar Possível:
sudo incapaz de escrever para / etc / profile 

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 acrescentar a um arquivo nessa situação sem ter que primeiro abri-lo com um sudoeditor e, em seguida, anexar o novo conteúdo à mão?


219


origem


Eu estou usando o Ubuntu 9.04 e sou capaz de usar o sudo para cada comando que precisei até agora. Gerar um sub-shell funcionou. - Matt Norris
Fortemente relacionado: Redirecionando o stdout para um arquivo no qual você não tem permissão de gravação(no Unix e Linux). Fracamente relacionado: ls com o caminho do diretório mostra arquivos, mas ls com padrão de arquivo não? - Scott


Respostas:


A ferramenta certa para a tarefa certa:camiseta'

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 de 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
  • Citar um comando complexo é muito mais fácil

327



No OS X tee só parece ter um sinalizador -a. - user495470
Debian 8 tee tem o -a anexar sinalizador. - clay
Usar echo "output" | sudo tee -a file > /dev/null se você quiser pular a saída do console. - Moshe Bixenshpaner
Funciona bem para o WSL também. - kayleeFrye_onDeck


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"

38





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 resto como argumentos.

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


22



A razão é que é o seu shell (rodando como você) que faz o redirecionamento, não o sudo. Como você não tem permissão para gravar no arquivo, recebe o erro Permissão negada. O que essa resposta faz é iniciar um novo shell que está sendo executado como root e, portanto, é capaz de gravar no arquivo. - Randy Orrison
Esta não é a resposta correta. Esta é uma resposta correta. Akira tem um melhor, pela lógica fornecida nessa resposta. - TOOGAM


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

4





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

4





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 su

su
echo ‘JAVA_HOME=/usr/lib/jvm/java-6-sun’ >> /etc/profile
exit

3



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


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 para /etc/profile. Isso tem o benefício adicional de poder verificar se /etc/profile já define JAVA_HOME.


0





Usar ex-caminho:

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

e substitua FOO com sua variável para anexar.

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

sudo chmod 644 /etc/profile

tente novamente.


0