Come aggiungere ad un file come sudo?


271

Voglio fare:

echo "something" >> /etc/config_file

Ma dato che solo l'utente root ha i permessi di scrittura per questo file, non posso farlo. Ma anche il seguente non funziona.

sudo echo "something" >> /etc/config_file

Esiste un modo per aggiungere un file in quella situazione senza dover prima aprirlo con un sudoeditor e poi aggiungere manualmente il nuovo contenuto?


Sto usando Ubuntu 9.04 e sono in grado di usare sudo per ogni comando di cui ho bisogno finora. La generazione di una sotto-shell ha funzionato.
Matt Norris,

Risposte:


391

Utilizzare tee -a(o tee --append) consudo

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

Quindi il tuo comando diventa

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

I vantaggi di teeoltre eseguire Bash con autorizzazioni amministrative sono

  • Non eseguire Bash con autorizzazioni amministrative
  • Solo la parte "Scrivi su file" viene eseguita con autorizzazioni avanzate
  • La citazione di un comando complesso è molto più semplice

2
Su OS X il tee sembra avere solo un flag -a.
Lri,

Debian 8 teeha il -aflag append.
argilla

9
Utilizzare echo "output" | sudo tee -a file > /dev/nullse si desidera saltare l'output della console.
Moshe Bixenshpaner,

Funziona bene anche per WSL.
kayleeFrye_onDeck

50

Il reindirizzamento viene eseguito nella shell corrente. Per eseguire il reindirizzamento con privilegi elevati, è necessario eseguire la shell stessa con privilegi elevati:

sudo bash -c "somecommand >> somefile"

26

Hanno generato sudo una sub-shell:

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

In questo esempio, sudo esegue "sh" con il resto come argomenti.

(questo è mostrato come esempio nella pagina man sudo)


8
Il motivo è che è la shell (in esecuzione come te) che esegue il reindirizzamento, non sudo. Poiché non si dispone dell'autorizzazione per scrivere nel file, viene visualizzato l'errore Autorizzazione negata. Ciò che questa risposta fa è avviare una nuova shell in esecuzione come root e quindi in grado di scrivere nel file.
Randy Orrison,

Questa non è la risposta giusta. Questa è una risposta giusta Akira ne ha una migliore, per la logica fornita in quella risposta.
TOOGAM,

6

Di solito uso il documento shell QUI con sudo tee -a . Qualcosa sulla falsariga di:

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

Secondo me, il migliore in questo caso è dd:

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

3

Potrebbe esserci un problema con il sudo qui e il reindirizzamento. Usa invece un editor di testo a tua scelta per aggiungere la riga.

sudo nano /etc/profile

Oppure, puoi provare invece su

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

Sfortunatamente, questo ha prodotto lo stesso risultato.
Matt Norris,

1
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile'dovrebbe funzionare. dal momento che non c'è nulla che la shell possa erroneamente espandere nell'arg per echo, virgoletta singola al comando generale.
Quack Quixote,

È fantastico. Ora fallo come parte di una sceneggiatura.
Ernie Dunbar,

0

Questo non funzionerà, stai tentando di reindirizzare (usando >>) l'output di sudo. Quello che vuoi veramente fare è reindirizzare l'output di echo. Ti suggerisco di usare semplicemente il tuo editor preferito e aggiungere quella riga manualmente a /etc/profile. Questo ha l'ulteriore vantaggio di poter verificare se /etc/profilegià impostato JAVA_HOME.


0

Usa ex -way:

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

e sostituisci FOOcon la tua variabile da aggiungere.

In alcuni sistemi (come OS X), il /etc/profilefile ha 444 autorizzazioni, quindi se ti viene ancora negata l'autorizzazione , controlla e correggi prima l'autorizzazione:

sudo chmod 644 /etc/profile

quindi riprovare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.