313 votes

Comment ajouter à un fichier en tant que sudo ?

Je veux le faire :

echo "something" >> /etc/config_file

Mais, comme seul l'utilisateur root a le droit d'écrire 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 des données à un fichier dans cette situation sans avoir à l'ouvrir au préalable à l'aide d'un logiciel de traitement de texte ? sudo et ensuite ajouter le nouveau contenu à la main ?

0 votes

J'utilise Ubuntu 9.04 et je suis capable d'utiliser sudo pour toutes les commandes dont j'ai eu besoin jusqu'à présent. La création d'un sub-Shell a fonctionné.

439voto

akira Points 58339

Utilice tee -a (ou tee --append ) avec sudo

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 tee sur l'exécution de Bash avec des permissions administratives sont

  • Vous n'exécutez pas Bash avec des droits d'administration.
  • Seule la partie "écriture dans le fichier" fonctionne avec des autorisations avancées.
  • La citation d'une commande complexe est beaucoup plus facile

2 votes

Sous OS X, tee ne semble avoir qu'un drapeau -a.

0 votes

Debian 8 tee a le -a drapeau de l'appendice.

16 votes

Utilice echo "output" | sudo tee -a file > /dev/null si vous voulez ignorer la sortie de la console.

59voto

La redirection est exécutée dans le Shell actuel. Afin d'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"

26voto

Keith Sirmons Points 2558

Que sudo génère un sous-Shell :

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

Dans cet exemple, sudo exécute "sh" avec le reste comme arguments.

(ceci est montré comme un exemple dans la page de manuel sudo)

8 votes

La raison est que c'est votre Shell (s'exécutant en tant que vous) qui fait la redirection, pas sudo. Puisque vous n'avez pas la permission d'écrire dans le fichier, vous obtenez l'erreur Permission refusée. Ce que cette réponse fait est de démarrer un nouveau Shell qui s'exécute en tant que root, et qui est donc capable d'écrire dans le fichier.

0 votes

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.

10voto

James andresakis Points 1060

J'utilise habituellement ShellDocument ICI avec sudo tee -a . Quelque chose du genre :

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

6voto

user316693 Points 61

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

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

0 votes

Faites attention. Cette commande écraserait le fichier /etc/profile. Vous devez ajouter les arguments "conv=notrunc oflag=append" pour obtenir le comportement souhaité.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X