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?


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

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"

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)


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

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

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

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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.