Comment ajouter un fichier en tant que sudo?

271

Je veux faire:

echo "something" >> /etc/config_file

Mais, étant donné que seul l'utilisateur root a l'autorisation d'écriture sur ce fichier, je ne peux pas le faire. Mais ce qui suit ne fonctionne pas non plus.

sudo echo "something" >> /etc/config_file

Existe-t-il un moyen d'ajouter un fichier à un fichier dans cette situation sans avoir à l'ouvrir au préalable avec un sudoéditeur 'd, puis à ajouter manuellement le nouveau contenu?

hsribei
la source
J'utilise Ubuntu 9.04 et suis capable d'utiliser sudo pour chaque commande dont j'ai eu besoin jusqu'à présent. Générer un sous-shell a fonctionné.
Matt Norris

Réponses:

391

Utiliser tee -a(ou tee --append) avecsudo

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

Donc, votre commande devient

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

Les avantages de teel'exécution de Bash avec des autorisations administratives sont les suivants:

  • Vous n'exécutez pas Bash avec des autorisations administratives
  • Seule la partie 'write to file' s'exécute avec des autorisations avancées
  • Citer une commande complexe est beaucoup plus facile
Akira
la source
2
Sur OS X, le tee ne semble avoir un drapeau -a.
Lri
Debian 8 teea le -adrapeau d’append.
argile
9
Utilisez cette option echo "output" | sudo tee -a file > /dev/nullsi vous souhaitez ignorer la sortie de la console.
Moshe Bixenshpaner
Fonctionne bien aussi pour WSL.
kayleeFrye_onDeck
50

La redirection est exécutée dans le shell actuel. Pour effectuer la redirection avec des privilèges élevés, vous devez exécuter le shell lui-même avec des privilèges élevés:

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

Demandez à sudo de générer un sous-shell:

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

Dans cet exemple, sudo lance "sh" avec le reste comme arguments.

(ceci est montré à titre d'exemple dans la page de manuel sudo)

Doug Harris
la source
8
La raison en est que c'est votre shell (qui s'exécute comme vous) qui fait la redirection, pas sudo. Puisque vous n'avez pas la permission d'écrire dans le fichier, vous obtenez l'erreur Permission denied. Ce que cette réponse fait est de démarrer un nouveau shell qui s'exécute en tant que root, et est donc capable d'écrire dans le fichier.
Randy Orrison
Ce n'est pas la bonne réponse. C'est une bonne réponse. Akira en a une meilleure, pour la logique fournie dans cette réponse.
TOOGAM
6

J'utilise habituellement un document shell ICI avec sudo tee -a . Quelque chose dans le genre 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
la source
4

À mon avis, le meilleur dans ce cas est dd:

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

Il peut y avoir un problème avec le sudo ici et la redirection. Utilisez plutôt un éditeur de texte de votre choix pour ajouter la ligne.

sudo nano /etc/profile

Ou, vous pouvez essayer le su à la place

su
echo ‘JAVA_HOME=/usr/lib/jvm/java-6-sun’ >> /etc/profile
exit
Policier
la source
Malheureusement, cela a donné le même résultat.
Matt Norris
1
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile'devrait marcher. puisqu'il n'y a rien que le shell puisse développer par erreur dans l'argument pour faire écho, cite la commande globale entre guillemets.
Quack Quichotte
C'est fantastique. Maintenant, faites cela dans le cadre d'un script.
Ernie Dunbar
0

Cela ne fonctionnera pas si vous essayez de rediriger (en utilisant >>) la sortie de sudo. Ce que vous voulez vraiment faire, c'est rediriger la sortie de echo. Je vous suggère simplement d'utiliser votre éditeur préféré et d'ajouter cette ligne manuellement /etc/profile. Cela a l'avantage supplémentaire que vous pouvez vérifier si /etc/profiledéjà défini JAVA_HOME.

innaM
la source
0

Utilisez ex-voie :

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

et remplacez FOOpar votre variable à ajouter.

Dans certains systèmes (tels que OS X), le /etc/profilefichier dispose de 444 autorisations. Par conséquent, si vous obtenez toujours une autorisation refusée , vérifiez et corrigez-la d'abord:

sudo chmod 644 /etc/profile

puis réessayez.

Kenorb
la source